前言
本文是对工厂模式中的简单工厂的学习笔记,如有错误请指正~
简单工厂不是设计模式,更像是一种编程习惯,是学习工厂模式的热身运动。理解了简单工厂,工厂模式的学习将水到渠成。
工厂的目标
所有的设计模式都是为了解决变化的问题,着力点在“封装变化点”。
工厂模式解决的问题是:实例化不应该总是公开地进行、初始化经常会造成耦合问题
所有的工厂模式都用来封装对象的创建。简单来讲就是将实例化的过程放在一个地方管理,将产品的“实现”从”使用“中解耦。这样客户的实例化代码就可以删掉了
概念
工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
依赖倒置原则:要依赖抽象,不要依赖具体类。
简单工厂Demo
你要开一家煎饼果子连锁店,目前包含正宗的临沂煎饼果子(放果子的那种)和枣庄菜煎饼(好多菜的那种)
煎饼果子商店
public class JBGZStore {
SimpleJBGZFactory factory;
public JBGZStore(SimpleJBGZFactory factory) {
this.factory = factory;
}
public Jianbingguozi orderJBGZ(String type) {
Jianbingguozi jbgz;
jbgz = factory.createJBGZ(type);
jbgz.prepare();
jbgz.make();
jbgz.cut();
return jbgz;
}
}
煎饼果子制作工厂
public class SimpleJBGZFactory {
public Jianbingguozi createJBGZ(String type) {
Jianbingguozi jianbingguozi = null;
if("正宗临沂煎饼果子".equals(type)) {
jianbingguozi = new LinyiJBGZ();
}else if("枣庄菜煎饼".equals(type)) {
jianbingguozi = new Zaozhuangcaijianbing();
}
return jianbingguozi;
}
}
煎饼果子的抽象类
public abstract class Jianbingguozi {
String name;
// 加什么
ArrayList<String> adders = new ArrayList<>(8);
void prepare() {
printf("开始准备制作" + name + "……");
for(int i = 0; i < adders.size();i++) {
printf("放 " + adders.get(i));
}
}
// 正常的煎饼果子制作是一样的
void make() {
printf("制作煎饼");
}
// 是否需要拦腰切断
void cut() {
printf("不需要切开");
}
private void printf(String str) {
System.out.println(str);
}
}
临沂煎饼果子
public class LinyiJBGZ extends Jianbingguozi{
public LinyiJBGZ() {
super.name = "临沂煎饼果子";
super.adders.add("果子");
super.adders.add("鸡蛋");
}
}
枣庄菜煎饼
public class Zaozhuangcaijianbing extends Jianbingguozi{
public Zaozhuangcaijianbing() {
super.name = "枣庄菜煎饼";
super.adders.add("生菜");
super.adders.add("鸡蛋");
super.adders.add("火腿肠");
super.adders.add("白菜");
super.adders.add("粉条");
}
@Override
void cut() {
System.out.println("枣庄菜煎饼会从中间切开");
}
}
Demo解析
上面的Demo就是一个简单的煎饼果子制作工厂,以后再上其他种类的煎饼果子只需要修改SimpleJBGZFactory
即可。
如果不使用工厂:
我们的煎饼果子产业规模扩大了,有了很多加盟店,每个商店可以制作煎饼果子,总店研究出什么类别的煎饼果子加盟店就做什么。如果新增一个煎饼果子种类(比如加糖的煎饼果子,有种黑暗料理的感觉。。)那么每个加盟店的都需要新增一个种类判断,改动的地方非常多。
上面存在的问题就是已有煎饼果子的优化和新增煎饼果子,所有的加盟店都必须修改,成本会非常高。严重限制了我们煎饼果子大业的发展。
煎饼果子工厂存在的意义是将变化和扩展都统一管理了。新增煎饼果子种类只需要新增一个子类TianJBGZ
,然后在SimpleJBGZFactory
中加一个判断if("甜口菜煎饼".equals(type)
即可,至于加盟店不需要做太多变化,只需要广告牌上加上”本店新上甜党最爱的甜口煎饼果子“
网友评论