前言
我们用一个开发订购披萨项目的故事来讲解
项目需求:要便于披萨种类的扩展,要便于维护
(1)披萨的种类很多(比如GreekPizza、CheesePizza)
(2)披萨的制作流程有 prepare、bake、cut、box
(3)完成披萨店订购功能
传统模式
如下代码中,我们写代码的逻辑会将大量的代码写在一块,造成了代码高耦合的情况,当我们要增加新的功能模块或修改某处功能等情况时,往往要修改多个地方,这样就造成程序可维护性、可扩展性、可读性、可重用性低的情况。
Pizza orderPizza(String type) {
Pizza pizza;
if(type.equals("chess"){
pizza = new ChessPizza();
}else if(type.equals("greek"){
pizza = new GreekPizza();
}else if(type.equals("apple"){
pizza = new ApplePizza();
}
....
//准备材料
pizza.prepare();
//烘烤
pizza.bake();
//切
pizza.cut();
//装盒
pizza.box();
return pizza;
}
传统模式UML图
简单工厂模式:
基本介绍:
1.简单工厂模式为创建型模式,是工厂模式家族中最简单实用的模式。简单工厂模式是由一个工厂对象决定创建哪一种产品类的实例,也就是把其他类(产品)的实例化对象放到工厂类中,需要什么对象(产品)直接从工厂类中拿。
2.简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。
3.在软件开发中,当我们用到大量的创建某种、某类或某批对象时,就会用到工厂模式。
将传统模式代码进行如下修改,其中SimpleFactory类为工厂类,对pizza进行加工等操作,将原来经常修改的代码抽取了出来。
SimpleFactory类
public class OrderPizza {
public OrderPizza(SimpleFactory factory){
setFactory(factory);
}
SimpleFactory factory = null;
public void setFactory(SimpleFactory simpleFactory){
String orderType = "";//用户输入的
this.factory = simpleFactory;
do{
orderType = getType();
Pizza pizza = factory.createPizza(orderType);
if (pizza != null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
System.out.println("订购Pizza失败!");
break;
}
}while (true);
}
//写一个方法 可以获取客户希望订购的pizza
private String getType() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请在下面输入你要购买的Pizza");
String pizza = reader.readLine();
return pizza;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
简单工厂模式的优缺点:
优点:
简单工厂模式提供专门的工厂类用于创建对象,实现了对象创建和使用的职责分离,客户端不需知道所创建的具体产品类的类名以及创建过程,只需知道具体产品类所对应的参数即可,通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点:
但缺点在于不符合“开闭原则”,每次添加新产品就需要修改工厂类。在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展维护,并且工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
为了解决简单工厂模式的问题,出现了工厂方法模式。
后续待补充.......
工厂方法
抽象工厂
此文参考两篇工厂模式优质文章: