通过具体的需求
看一个披萨的项目:要便于披萨种类的扩展,要便于维护
- 披萨的种类很多(比如 GreekPizz、 CheesePizz 等)
- 披萨的制作有 prepare, bake, cut, box
- 完成披萨店订购功能。
首先我们如果用传统的方式完成,
我们会用一个OrderPizza.java 类来根据用户输入直接new 对应的pizza ,如下:
if (ordertype.equals("greek")) {
pizza = new GreekPizza();
}
else if (ordertype.equals("pepper")) {
pizza = new PepperPizza();
}
else if (ordertype.equals("cheese")) {
pizza = new CheesePizza();
} else {
break;
}
}
这样如果我们要新增一个Pizza的种类,我们需要 去OrderPizza.java中再加一个 else if, 而且通常情况OrderPizza类不止有一种, 我们新增的时候就要去每个定Pizza的类都加.
因此传统方式是违反了设计模式的ocp原则,即对扩展开放,对修改关闭.即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码
三种工厂模式
软件开发中,当我们会用到大量的创建某种 某类或某批对象时,就会使用工厂模式
- 工厂模式的意义
将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。 - 三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)
- 设计模式的依赖抽象原则
- 创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。
- 不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
- 不要覆盖基类中已经实现的方法。
简单工厂模式(静态工厂模式)
基本介绍
- 简单工厂模式属于创建型模型,是工厂模式的一种.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式.
- 简单工厂模式定义了一个创建对象的类,由这个类来封装实例化对象的行为
设计方案
- 改进思路:简单工厂模式:创建Pizza对象封装到一个类中,这样我们有新的Pizza种类时,只需要修改该类就可, 其它有创建到Pizza对象的代码就不需要修改了
- SimplePizzaFactory定义一个可以实例化Pizaa对象的类,封装创建对象的代码
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
System.out.println("使用简单工厂模式~~");
Pizza pizza = null;
if (type.equals("cheese")) {
pizza = new CheesePizza();
}
else if (type.equals("greek"))