什么是工厂模式?
工厂模式又名工厂方法,是⼀种创建型设计模式,其在父类中提供⼀个创建对象的方法,由子类决定实例化对象的类型。
为什么要用工厂模式?
这种设计模式也是 Java 开发中最常见的⼀种模式,它的主要意图是定义⼀个创建对象的接口,让其子类自己决定实例化哪⼀个工厂类,工厂模式使其创建过程延迟到子类进行。
简单说就是为了提供代码结构的扩展性,屏蔽每⼀个功能类中的具体实现逻辑。让外部可以更加简单的只是知道调用即可。当然这可能也有⼀些缺点,比如需要实现的类非常多,如何去维护,怎样减低开发成本。但这些问题都可以在后续的设计模式结合使用中,逐步降低。
怎么样使用工厂模式
在提到怎样使用前,假设一个业务场景
蝼蚁压抑了就想吃香蕉去健身
上班累了就想吃木瓜去按摩
开心了就想吃草莓然后回家种草莓
多种类型的水果,味道,吃完后想去做的事是不一样的
假设按照正常的逻辑实现
public static void main(String[] args) {
WlltAnt wlltAnt = new WlltAnt();
wlltAnt.setStatus(1);
WlltAnt wlltAnt2 = new WlltAnt();
wlltAnt2.setStatus(2);
WlltAnt wlltAnt3 = new WlltAnt();
wlltAnt3.setStatus(3);
eat(wlltAnt);
eat(wlltAnt2);
eat(wlltAnt3);
}
static void eat(WlltAnt ant) {
if (1 == ant.getStatus()) {
//压抑的蝼蚁
Banana banana = new Banana(ant);
banana.goExercise();
} else if (2 == ant.getStatus()) {
//累了的蝼蚁
Papaya papaya = new Papaya(ant);
papaya.goMassage();
} else if (3 == ant.getStatus()) {
//开心的蝼蚁
Strawberry strawberry = new Strawberry(ant);
strawberry.goStrawberry();
}
}
运行结果:
吃了根香蕉去健身了
吃了个木瓜去按摩了
吃了个草莓去种草莓了
项目经理突然抽风:改个需求吧
蝼蚁分别想吃不同口味的不同的数量的去坐不同的事
public static void main(String[] args) {
WlltAnt wlltAnt = new WlltAnt();
wlltAnt.setStatus(1);
//添加口味
wlltAnt.setFlavor("糯糯的");
WlltAnt wlltAnt2 = new WlltAnt();
wlltAnt2.setStatus(2);
wlltAnt2.setFlavor("香香的");
//添加数量
wlltAnt2.setNum(3);
WlltAnt wlltAnt3 = new WlltAnt();
wlltAnt3.setStatus(3);
wlltAnt3.setFlavor("酸酸的");
//做不同的事
wlltAnt3.setTodo("去干点不可描述的事");
eat(wlltAnt);
eat(wlltAnt2);
eat(wlltAnt3);
}
static void eat(WlltAnt ant) {
if (1 == ant.getStatus()) {
//压抑的蝼蚁
Banana banana = new Banana(ant);
banana.goExercise();
} else if (2 == ant.getStatus()) {
//累了的蝼蚁
Papaya papaya = new Papaya(ant);
papaya.goMassage();
} else if (3 == ant.getStatus()) {
//开心的蝼蚁
Strawberry strawberry = new Strawberry(ant);
strawberry.goStrawberry();
}
}
运行结果:
吃了根糯糯的香蕉去健身了
吃了3个香香的木瓜去按摩了
吃了个酸酸的草莓去干点不可描述的事
项目经历再次抽风再改需求:现在又来了三十只蝼蚁
…
发现项目经历每次抽风都要在原有的代码上去改动(破坏了开闭原则),三十只蝼蚁就意味着去添加三十个对象(ps:阔以搞个循环嘛),但是需要添加着不同的属性,循环这里就不再那么适合了,这个时候就可以假如工厂模式,添加一个蝼蚁工厂类,让工厂去给我建立对象,我们只需要做选择就好了。。
蝼蚁工厂
static WlltAnt createAnt(String type) {
WlltAnt wlltAnt = new WlltAnt();
switch (type) {
case "香蕉1":
wlltAnt.setStatus(1);
wlltAnt.setTodo("去学习了");
wlltAnt.setNum(1);
wlltAnt.setFlavor("糯糯的");
break;
case "香蕉2":
wlltAnt.setStatus(1);
wlltAnt.setTodo("去学习了");
wlltAnt.setNum(2);
wlltAnt.setFlavor("糯糯的");
break;
case "香蕉3":
wlltAnt.setStatus(1);
wlltAnt.setTodo("去学习了");
wlltAnt.setNum(3);
wlltAnt.setFlavor("糯糯的");
break;
case "木瓜学习":
wlltAnt.setStatus(2);
wlltAnt.setTodo("去学习了");
break;
case "木瓜按摩":
wlltAnt.setStatus(2);
wlltAnt.setTodo("去按摩了");
break;
case "草莓酸酸":
wlltAnt.setStatus(3);
wlltAnt.setFlavor("酸酸的");
break;
case "草莓甜甜":
wlltAnt.setStatus(3);
wlltAnt.setFlavor("甜甜的");
break;
//根据不同的口味,数量,想去做的事去建立不同的对象
}
return wlltAnt;
}
调用工厂
//根据不同的对象去选择就好
WlltAnt wlltAnt = AntFactory.createAnt("草莓酸酸");
WlltAnt wlltAnt2 = AntFactory.createAnt("香蕉2");
WlltAnt wlltAnt3 = AntFactory.createAnt("木瓜按摩");
//more ...
eat(wlltAnt);
eat(wlltAnt2);
eat(wlltAnt3);
蝼蚁吃了个酸酸的草莓
蝼蚁吃了2根香蕉去
蝼蚁吃了个木瓜去按摩了
总结
(皮)简单工厂模式可以给我们带来项目经历经常抽风的问题。
从上到下的优化来看,⼯⼚⽅法模式并不复杂,甚⾄这样的开发结构在你有所理解后,会发现更加简单了。
那么这样的开发的好处知道后,也可以总结出来它的优点。
避免创建者与具体的产品逻辑耦合 、 满足单⼀职责,
每一个业务逻辑实现都在所属自己的类中完成 、 满足开闭原则
以上案例都是从简开发,实际开发中我们还可以去优化,根下次学习的抽象工厂相关