工厂模式
程序想要可以很好的维护,各个类的功能应该尽可能的解耦,每个类有自己的职能,这样当需要对代码进行变动的时候,不会“牵一发而动全身”,工厂模式就是为了解耦而分离。
**注意:**代码太多,我就不贴了,可以先直接划到底部,下载对应代码,之后对应文章食用更佳。
一、作用
将类的创建和类的使用分离,交给不同的类去执行,就是将类的创建工作交给工厂。
二、举例说明
1.需求说明
设计需求:
有一个DrinkStore类–>可以完成饮料的生产
一共生产三种饮料(继承于Drink)
- LemonWater(柠檬水)
- GreenTea(绿茶)
- RedTea(红茶)
每种饮料的基本流程为:
- 准备原材料 prepare
- 搅拌 mixing
- 打包 pack
2.普通代码书写
总体代码框图:
baseDrink是饮料的基类,其他类均继承他,除了prepare方法不同之外,其余方法与子类相同,每个子类覆盖父类的prepare方法。
重点看mian,代码使用时:
- 需要创建一个store
- 传入字符串以告诉store需要哪种饮料
public class main {
public static void main(String[] args) {
DrinkStore drinkStore = new DrinkStore();
drinkStore.orderDrink("greenTea");
}
}
DrinkStore的代码,可以看到该创建部分十分冗余。
public class DrinkStore {
public baseDrink orderDrink(String type) {
baseDrink drink=null;
if (type.equals("greenTea")) {
drink = new greenTea();
} else if (type.equals("redTea")) {
drink = new redTea();
} else if (type.equals("lemonWater")) {
drink = new lemonWater();
}
drink.prepare();
drink.mixing();
drink.pack();
return drink;
}
}
3.代码改进
专门创建一个drinkFactory去创建drink,也就是将创建类的委托给一个类去执行,这个类就是简单工厂,完成了类的创建和使用分离。
public class DrinkFactory {
public baseDrink createDrink(String type) {
baseDrink drink = null;
if (type.equals("greenTea")) {
drink = new greenTea();
} else if (type.equals("redTea")) {
drink = new redTea();
} else if (type.equals("lemonWater")) {
drink = new lemonWater();
}
return drink;
}
}
public class DrinkStore {
DrinkFactory drinkFactory;
public DrinkStore(DrinkFactory drinkFactory) {
this.drinkFactory = drinkFactory;
}
public baseDrink orderDrink(String type) {
baseDrink drink = drinkFactory.createDrink(type);
drink.prepare();
drink.mixing();
drink.pack();
return drink;
}
}
public class main {
public static void main(String[] args) {
DrinkStore drinkStore = new DrinkStore(new DrinkFactory());
drinkStore.orderDrink("greenTea");
}
}
4.需求变更
需要在北京和上海开两家分店,并且每家商店生产的drink在制造的时候,上海的要加入糖,北京的要加入盐(确实…很奇怪,但是就是为了举例子)。
代码结构:
main中的内容:
public class main {
public static void main(String[] args) {
//这里通过多态 直接替换工厂和下面的字符串
//就可以得到想要的实体类
DrinkStore drinkStore = new DrinkStore(new BJDrinkFactory());
drinkStore.orderDrink("greenTea");
}
}
运行结果:
总结
说白了,工厂模式,就是将创建类委托给别人进行,这在类的初始化很麻烦的时候尤其有用。
整体代码下载:
链接:https://pan.baidu.com/s/1q-ylcKdw3WaBR5yoCGmsZA
提取码:dadx