工厂模式开篇-介绍+简单工厂
工厂模式
工厂设计模式的原则
- OCP原则,即系开闭原则。代码应该对扩展开发,对修改关闭。
- 依赖抽象原则(面向接口)。类应该尽量依赖接口、或者抽象类。
- 不继承非抽象类,就算继承了也尽量不要修改其代码。
工厂设计模式应用背景
在对象中,如果要频繁根据条件,创建某类对象,就应该使用工厂设计模式。把创建这类对象的代码(可能变化的代码),与使用这些代码的(客户端)使用端,分离。
同时,使用了工厂模式,代替new的操作。相当于在引用与对象之间,加了一层缓冲,使得代码的结构更加灵活。
工厂设计模式
工厂设计模式分为
- 简单工厂(静态工厂)
- 工厂方法
- 抽象工厂(感觉用得最多的)
以上三种的核心思想:其实都是讲可能会变化的new的操作,与不变化使用端的代码进行分离。
简单工厂模式
案例:一间肠粉店卖肠粉专做外卖,一份肠粉的流程是:
- 根据客人订单准备肠粉的材料(虾饺、瘦肉、鸡蛋。。。) prepare
- 蒸熟肠粉 cook
- 配上美美的酱油 oil
- 用外卖盒打包 box
如果现在要做一个小程序,实现上面的功能,要怎么设计类?
常规做法
public class CDF {
String getType(){
return "egg";
}
void createOrder(){
CF order = null;
String type = this.getType();
if(type == "egg") {
order = new EggCF();
}else if(type == "pork"){
order = new PorkCF();
}else if(type == "beef"){
order = new BeefCF();
}else{
System.out.println("本店无此类肠粉");
return;
}
//开始做单
order.prepare();
order.cook();
order.oil();
order.box();
System.out.println("完成订单");
}
}
按照这种做法,每次添加新的肠粉类,就要修改这个CDF类。显然,把变化的部分抽离,又因为要创建对象所以,可以利用简单工厂。
优化
public class CFfactory {
public static CF createCF(String type){
CF order = null;
if(type == "egg") {
order = new EggCF();
}else if(type == "pork"){
order = new PorkCF();
}else if(type == "beef"){
order = new BeefCF();
}else{
System.out.println("本店无此类肠粉");
}
return order;
}
}
public class CDF {
String getType(){
return "pork";
}
void createOrder(){
CF order = CFfactory.createCF(this.getType());
//开始做单
order.prepare();
order.cook();
order.oil();
order.box();
}
}
这样左后,就算添加了新的类型,只要修改factory的代码,和添加一个新的类型就可以。
同时,如果有多个使用端同时需要CF对象,那么只需要集中修改工厂,不要修改其他的使用端代码。