简单工厂模式
工厂模式是为了解耦:可以将对象的创建和使用分离**,如果不分离,不但违反了设计模式的开闭原则,需要使用另一个子类的话,需要修改源代码 ,**把对象的创建和使用的过程分开。
如果这个时候想要扩展或者删除pizza类,那么必须修改代码:
封装创建代码的对象
方法返回一个类实例给调用者
这个时候,创建一个对象就可以变成现在的代码:
类图
披萨店对象含有比萨工厂对象,披萨工厂对象里面有披萨对象
工厂模式
如果现在又三家比萨店,纽约风味披萨店、芝加哥风味店、加州风味店。
这样:
工厂方法模式
通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。
- 创建者类Creator
- 是一个抽象的创建者类
- 定义了一个抽象的工厂方法,并不实现工厂方法,而是让子类实现这个方法来制造产品。
- 创建者类一般包含依赖于抽象产品的代码,而这些抽象产品由子类制造。创建者不需要真的知道制造哪种的具体产品。
- 定义了一个创建对象的接口,由子类决定要实例化的类是哪一个。把类的实例化推迟到了子类
- 在抽象的Creator中,任何其他的方法,都可能使用到这个工厂方法所制造出来的产品,但只有子类真正实现这个工厂方法并创建产品。
- 编写Creator类的时候,并不知道实际创建的产品是哪一个;选择哪一个子类进行生产,自然决定了实际创建的产品是什么。
- 产品类
- 具体的产品
以披萨店为例子
public abstract class PizzaStore(){
// 订购披萨
public Pizza orderPizza(){
// 使用抽象方法创建披萨,(实际是子类去具体创建)
Pizza pizza = createPizza();
pizza.prepare();
pizza.bake();
pizza.box();
return pizza();
}
public abstract Pizza createPizza(String type); // 并不实现工厂方法
}
// 具体的披萨工厂
public class NewYorkPizzaStore extend PizzaStore{
public Pizza createPizza(String type){
if(type.equals("chess")) return new NYChessPizza();
if(type.equals("clam")) return new NYClamPizza();
return null;
}
}
用户调用的时候
NewYorkPizzaStore nyStore = new NewYorkPizzaStore();
nyStore.orderPizza("chess")-->{nyStore.createPizza();pizza.prepare(); pizza.bake(); pizza.box();}
抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
- 允许客户使用抽象的接口来创建一组相关的产品,而不知道实际产出的具体产品是什么。使客户从具体产品中解耦。
- 抽象工厂
- 定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含一组方法来生产产品。
- 具体工厂
- 每个具体工厂实现不同的产品族,要创建一个产品,客户只需要使用其中一个工厂而完全不需要实例化任何产品对象。
区别
工厂方法
- 使用继承
- 实例化具体类
抽象工厂
- 使用组合
- 可以把一群相关的产品集合起来