创建型 | 结构型 | 行为型 |
---|---|---|
工厂方法(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)<对象> |
原型模式
模式描述
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Prototype(原型)定义一个Clone自身的接口,ConcretePrototype实现实际的Clone接口来返回自身的拷贝对象。这种拷贝对象的方式和直接new一个对象最大的区别在于能够较快地将对象当前的状态一起拷贝。
优缺点
优点:
- 可以在运行时刻增加和删除产品,只需要注册原型实例就可以将一个新的具体产品类并入系统
- 可以减少子类的构造,工厂方法经常产生一个与产品类层次平行的Creator类,原型模式则不需要
- 改变原型对象的值或结构来指定新的对象,例如修改一个拷贝的原型对象的状态再注册为一个新的原型,以此减少类的数量
缺点:
- 当需要动态创建或销毁原型时,需要一个原型管理器
- 原型的对象拷贝需要深拷贝,实现上会比较麻烦
适用场景
- 当一个系统应该独立于它的产品创建、构成和表示时。例如一个通用图形系统是框架性的定义,不没有限制具体的应用方向,可以是音乐软件或者是数学图形软件,对应的产品就可以使用原型模式。
- 当要实例化的类是在运行时刻指定时。例如画图软件上添加了一个基础的圆形之后进行了修改,此时要复制修改后的圆形。
- 避免创建一个与产品类层次平行的工厂类层次时。
- 当一个类的实例只能有几个不同状态组合中的一种时。例如一个电路设计软件,开关只能有开或关中的一种状态。
相关模式
原型(Prototype)模式和抽象工厂(AbstractFactory)模式在某种方面是相互竞争的。但是它们也可以一起使用:抽象工厂可以存储一个被克隆的原型的集合,并且返回产品对象。
大量使用组合(Composite)模式和装饰者(Decorator)模式的设计通常也可从Prototype模式处获益。