Factory_工厂模式
使用工厂模式的目的,是将选择实现类,创建对象统一管理和控制,从而将调用者和创建者解耦
场景需求
public interface Car { public void name(); } //Car车接口
现在有两种车:五菱宏光和特斯拉
//五菱宏光
public class Wuling implements Car{
public void name(){ System.out.println("五菱宏光"); }
}
//特斯拉
public class Tesla implements Car{
public void name(){ System.out.println("特斯拉"); }
}
如果张三想要一辆五菱宏光,他只能自己徒手造车。
public class ZhangSan {
public static void main(String[] args) {
Car wuling = new Wuling();
wuling.name();
}
}
但如果生产五菱宏光很麻烦,需要很多张三不知道的参数,所以他只能去买一辆,于是他来到了4S店...
简单工厂模式
首先了解一下简单工厂设计模式,又叫静态工厂模式,它不属于23种设计模式之一
那么4S店的老板会问你:小伙子~你想要买什么呀?是买五菱宏光呢,还是买特斯拉呀~
public class FourS_Factory {
public static Car BuyCar(String carName){
if("五菱宏光".equals(carName)){
return new Wuling();
}else if ("特斯拉".equals(carName)){
return new Tesla();
}else{
System.out.println("抱歉!没货~");
return null;
}
}
}
张三说:老板,给我来辆五菱宏光!,于是乎4S店的老板就卖给张三一辆五菱宏光。
public class ZhangSan {
public static void main(String[] args) {
Car wuling = FourS_Factory.BuyCar("五菱宏光");
wuling.name();
}
}
这就是简单工厂,它并没有满足开闭原则,如果门店上新,工厂里的判断要增加,必然会修改原有代码。虽然某种程度上不符合设计原则,但实际使用最多!
工厂方法模式
工厂方法模式给每个实现类都定义了一个实现工厂接口的工厂类,完全实现了开闭原则
public interface CarFactory {
Car create();
}
为了不被4S店中间商赚差价,张三直接找到了生产五菱宏光的工厂买车...
public class WulingFactory implements CarFactory {
@Override
public Car create() { return new Wuling(); }
}
public class ZhangSan {
public static void main(String[] args) {
Car wuling = new WulingFactory().create();
wuling.name();
}
}
工厂方法模式,虽然符合开闭原则,但代码量变多了。
抽象工厂模式
假设现在有华为和小米两个厂商,每个厂商又都生产手机和路由器两种商品,那么22得4,有4个具体的产品。
//手机接口
public interface Phone { public void call(); }
//路由器接口
public interface Router { public void connect(); }
不管是哪个厂商,手机都应该实现手机接口重写呼叫方法call(),路由器都应该实现路由器接口重写连接方法connect()
public class HuaWeiPhone implements Phone {
public void call() { System.out.println("华为手机呼叫中..."); }
}
public class HuaWeiRouter implements Router {
public void connect() { System.out.println("华为路由器连接中..."); }
}
那么现在有一个工厂接口,所有工厂都应该实现这个接口,每个具体的工厂都应该能创建手机和路由器。
public interface SuperFactory {
Phone createPhone();
Router createRouter();
}
例如现在有一个华为工厂,那它生产的手机就是华为手机,生产的路由器就是华为的路由器
public class HuaWeiFactory implements SuperFactory {
@Override
public Phone createPhone() { return new HuaWeiPhone(); }
@Override
public Router createRouter() { return new HuaWeiRouter(); }
}
那么张三现在想买一部华为手机,那么他就要去华为工厂就可以买到..
public class ZhangSan {
public static void main(String[] args) {
HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
Phone phone = huaWeiFactory.createPhone();
phone.call();
}
}
抽象工厂模式将一个系列相关的具体产品统一到一起创建,例如华为系列,小米系列...各个系列之间是分离的,所以在添加新的系列时不用动其他原有的代码,但是规定了每个系列中的产品集合,要扩展新的产品会很困难。
本文来自博客园,作者:独游空想家,转载请注明原文链接:https://www.cnblogs.com/linzhikai/p/16514468.html