创建型 | 结构型 | 行为型 |
---|---|---|
工厂方法(Factory Method)<类> | 适配器(Adapter)<类, 对象> | 解释器(Interpreter)<类> |
抽象工厂(Abstract Factory)<对象> | 桥接(Bridge)<对象> | 模板方法(Template Method)<对象> |
建造者(Builder)<对象> | 组合(Composite)<对象> | 责任链(Chain of Responsibility)<对象> |
原型(Prototype)<对象> | 装饰者(Decorator)<对象> | 命令(Command)<对象> |
单例(Singleton)<对象> | 外观(Facade)<对象> | 迭代器(Iterator)<对象> |
享元(Flyweight)<对象> | 中介者(Mediator)<对象> | |
代理(Proxy)<对象> | 备忘录(Memento)<对象> | |
观察者(Observer)<对象> | ||
状态(State)<对象> | ||
策略(Strategy)<对象> | ||
访问者(Visitor)<对象> |
工厂方法模式
模式描述
工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化那一个类,使得一个类的实例化延迟到它的子类。
其中Creator类中的FactoryMethod接口就是一个工厂方法,Creator的子类ConcreteCreator通过重写工厂方法来创建自己想要的产品对象。
优缺点
优点:
- 不会将特定应用有关的类绑定到自己的代码中。代码仅处理Product的接口,因此它可以和任何ConcreteProduct类一起使用
缺点:
- 为了创建一个特定的ConcreteProduct对象,就不得不创建对应的ConcreteCreator子类
适用场景
- 当一个类不知道它所必须创建的对象的类的时候。例如文件另存为支持多种格式时,只有在实际选择后才知道选择的格式。
- 当一个类希望由它的子类来指定它所创建的对象的时候。当支持多种数据库连接时,在运行时指定连接哪种数据库。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且把你希望将哪一个帮助子类是代理者这一信息局部化的时候。暂时未理解。
扩展使用
- 参数化工厂方法。给工厂方法增加一个类型参数,这样工厂方法就能根据类型来创建多种不同类型的产品。
Product* FactoryMethod(ProductType type)
{
switch(type)
{
case A: return new ProductA;
case B: return new ProductB;
...
}
return nullptr;
}
相关模式
抽象工厂(Abstract Factory)经常用工厂方法来实现,工厂方法通常在模板方法(Template Method)中被调用。