设计模式利剑7-原型模式

来源:互联网 发布:windows闹钟软件 编辑:程序博客网 时间:2024/04/28 20:36

定    义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,Prototype模式同工厂模式,同样对客户隐藏了对象的创建工作,但是,与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的,达到了“隔离类对象的使用者和具体类型(易变类)之间的耦合关系”的目的。

优    点:

            1、性能优良,特别是在循环内产生大量对象时,原型模式可以更好的体现优点

            2、逃避构造函数的约束,拷贝不会执行构造函数

            3、它对客户隐藏了具体的产品类,因此减少了客户知道的名字的数目。

            4、Prototype模式允许客户只通过注册原型实例就可以将一个具体产品类并入到系统中,客户可以在运行时刻建立和删除原型。

            5、减少了子类构造,Prototype模式是克隆一个原型而不是请求工厂方法创建一个,所以它不需要一个与具体产品类平行的Creater类层次。

            6、Portotype模式具有给一个应用软件动态加载新功能的能力。由于Prototype的独立性较高,可以很容易动态加载新功能而不影响老系统。

            7、产品类不需要非得有任何事先确定的等级结构,因为Prototype模式适用于任何的等级结构

使用场景:

            1、资源优化场景

            2、性能和安全要求的场景

            3、一个对象多个修改者的场景

            4、当一个系统应该独立于它的产品创建,构成和表示时;

            5、当要实例化的类是在运行时刻指定时,例如,通过动态装载;

           6、为了避免创建一个与产品类层次平行的工厂类层次时;

           7、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

概    述:在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构。这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适。那么如何封装这种动态的变化?从而使依赖于这些易变对象的客户程序不随着产品类变化?

1.为什么需要Prototype模式?

        引入原型模式的本质在于利用已有的一个原型对象,快速的生成和原型对象一样的实例。你有一个A的实例a:A a = new A();现在你想生成和car1一样的一个实例b,按照原型模式,应该是这样:A b = a.Clone();而不是重新再new一个A对象。通过上面这句话就可以得到一个和a一样的实例,确切的说,应该是它们的数据成员是一样的。Prototype模式同样是返回了一个A对象而没有使用new操作

2.引入Prototype模式带来了什么好处?

        可以看到,引入Prototype模式后我们不再需要一个与具体产品等级结构平行的工厂方法类,减少了类的构造,同时客户程序可以在运行时刻建立和删除原型。

3.Prototype模式满足了哪些面向对象的设计原则?

        依赖倒置原则:上面的例子,原型管理器(ColorManager)仅仅依赖于抽象部分(ColorPrototype),而具体实现细节(ConcteteColorPrototype)则依赖与抽象部分(ColorPrototype),所以Prototype很好的满足了依赖倒置原则。

理    解:先来看看原型模式的类图结构,ProtyType必须要实现Clone方法

image       下面来看看在系统中实现一个颜色索引器的例子,子类复制

image        再来看一个群发邮件的设计:

image