简单工厂模式
业务需求:
- 披萨项目,便于扩展,便于维护
- 披萨种类很多
- 披萨制作
- 披萨店订购功能
类图
普通代码实现
pizza抽象类
// pizza抽象类
public abstract class Pizza {
// pizza名字
protected String name;
// 准备材料,不同pizza不一样
public abstract void prepare();
public void bake(){
System.out.println(name+" baking");
}
public void cut() {
System.out.println(name+" cutting");
}
public void box() {
System.out.println(name+" boxing");
}
public void setName(String name) {
this.name = name;
}
}
具体披萨子类
// 奶酪披萨子类
public class CheesePizza extends Pizza{
@Override
public void prepare() {
System.out.println("准备奶酪披萨原材料");
}
}
public class GreekPizza extends Pizza{
@Override
public void prepare() {
System.out.println("准备希腊披萨原材料");
}
}
制作披萨类
public class OrderPizza {
// 构造器
public OrderPizza() {
Pizza pizza = null;
String orderType;// pizza类型
do {
orderType = getType();
if (orderType.equals("greek")) {
pizza = new GreekPizza();
pizza.setName("希腊披萨");
} else if (orderType.equals("cheese")) {
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
} else {
break;
}
// 输出制作过程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} while (true);
}
// 动态获取披萨种类
private String getType() {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入披萨种类");
String str = null;
try {
str = strin.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
客户端
// 披萨店相当于客户端,发出订购
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza();
}
}
传统方式分析:
- 优点:好理解,简单易操作
- 缺点:违反设计模式OCP原则(对扩展开放,对修改关闭)。当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码
- 如果此时新增一个披萨种类,我们需要新增类、修改OrderPizza代码,如果OrderPizza有很多,会更加麻烦
- 如果把创建披萨对象封装到一个类中,当有新披萨种类时,只需要修改该类即可,其他创建披萨对象的代码就不需要修改
简单工厂模式介绍
- 属于创建型模式,是工厂模式的一种;简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单的模式
- 简单工厂模式:定义了一个对象的类,由这个类来封装实例化对象的行为
- 当我们大量的创建某种、某类、某批对象时,就会使用到工厂模式
简单工厂改进代码
披萨父类和子类
// pizza抽象类
public abstract class Pizza {
// pizza名字
protected String name;
// 准备材料,不同pizza不一样
public abstract void prepare();
public void bake(){
System.out.println(name+" baking");
}
public void cut() {
System.out.println(name