工厂模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对。
工厂模式根据抽象程度的不同分为:
- 简单工厂
- 抽象工厂
- 工厂方法
简单工厂:一个模块仅需要一个工厂类,没有必要把他生产出来,使用静态方法
抽象工厂(Abstract Factory ):客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。
给大家举个例子:
追 MM 少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是 MM 爱吃的东西,
虽然口味有所不同,但不管你带 MM 去麦当劳或肯德基,只管向服务员说“来四个鸡
翅”就行了。麦当劳和肯德基就是生产鸡翅的 Factory(工厂)
代码演示:
public abstract class AbstractCreator {
//创建A产品家族
public abstract AbstractProductA createProductA();
//创建B产品家族
public abstract AbstractProductB createProductB();
}’’
工厂方法(Factory Method ):核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
在接着上面的例子:
请 MM 去麦当劳吃汉堡,不同的 MM 有不同的口味,要每个都记住是一件烦人的事情,我一般采用 Factory Method 模式,带着 MM 到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让 MM 直接跟服务员说就行了。
应用场景:
- 日志记录器
- 数据库访问
- 设计一个连接服务器的框架,需要三个协议,“pop3”、“IMAP”、“HTTP”可以把这个三个作为产品类,共同实现一个接口。