【创建型】原型模式

原型模式主要是用原型实例指定创建原型对象的种类,并且通过拷贝原型创建新对象。最简单的理解就是克隆。就如cocos2d-x中的 class Clonable::clone();该模式的主要目的是可以在运行时,随时创建出某个对象的副本,并且副本具有与本体一样的状态信息。类图参考如下:

模式的编码结构参考如下:

 1 namespace propotype
 2 {
 3     /**************************************************************************
 4      * create   : (jacc.kim) [5-18-2016]
 5      * summary  :
 6     **************************************************************************/
 7     class IClonable
 8     {
 9     public:
10         virtual IClonable* clone() = 0;
11     };//class IClonable
12
13     class ConcreteClass : public IClonable
14     {
15     public:
16         // some code here........
17         virtual IClonable* clone() override;
18
19     private:
20         // some member data here........
21         int         m_nTheIntData;  // this is a test member data.
22     };//class ConcreteClass
23
24 }//namespace propotype

模式编码结构参考

该模式的优点非常明显,可以在任何需要的时候,轻松轻松地克隆出一份当前目标的副本出来,并且最最重要的是现场状态会保持。另外,对于Client来说,同样是解除了与具体对象子类的直接依赖关系。

有优点,同样也有缺点。它的缺点也是很明显的,即为了同步现场状态,有时候clone()行为会比较复杂,实现比较繁琐。尤其在如c++这样的语言中,必需要要注意对象间的深、浅拷贝问题,一不小心就可能出现问题。

时间: 2024-10-22 05:39:24

【创建型】原型模式的相关文章

创建型—原型模式

1.原型模式意图: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.场景描述: 原型模式,利用实例自身的克隆功能来得到与原实例相同的新的实例. 设想西游记中的一个场景,唐僧师徒四人(白龙马除外),不过,该唐僧是个多事.喜欢使唤徒弟的唐僧.每当有事时,唐僧便会使唤他的三个徒弟去做.但是三个徒弟尽职尽责,为了保护师傅,必须留在唐僧身边.此时,多亏了三个徒弟能够千变万化,且都可通过毛发来变作自身(八戒.沙僧不知是否具有此功能?暂时看做有吧).当唐僧需要洗衣.化斋.喝水.探路.借宿

设计模式-创建型-原型模式

引言: 原型模式是什么?它是在什么场景下被提出的呢?本章节,我们将详细了解下原型模式. 在软件系统中,当创建一个类的实例过程过于昂贵或复杂,并且我们需要创建多个这样类的实例时,如果我们通过new来创建类实例,这就会增加创建类的复杂度和创建过程与客户代码复杂的耦合度.如果采用工厂模式来创建这样的实例对象的话,随着产品类的不断增加,导致子类的数量不断增多,也导致了相应工厂类的增加,维护的代码维度增加了,因为有产品和工厂两个维度了,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适

06.创建型————原型模式

package Create.e.Prototype; //原型业务类 需要实现克隆接口 public class Dog implements Cloneable{ public int legCounts; public Dog(int legCounts){ this.legCounts = legCounts; } public void changeLegCounts(){ this.legCounts *= 2; } public String toString(){ return

创建型-生成器模式(Builder)

1.意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.场景描述: 编辑软件的“另存为”功能便是生成器模式的一个体现.例如,Word的另存为功能,可以选择将文件存储为doc.docx.pdf.txt等格式,但是通过word的另存为功能转变文档的存储格式时都采用了“文件 --> 另存为”,相同的创建过程.当需要对word支持新的类型转换时,例如,添加*.newtype类型的转换,此时只需在“另存为”对话框的“选择存储类型”中添加一行"*.newtype&q

【JS】JavaScript中对象的创建与原型模式

 ECMAScript中没有类的概念,因此它的对象与基于类的语言中的对象有所不同. 1.理解对象 创建对象最简单的方式是创建一个Object实例,再为它添加属性和方法,如下: <span style="font-family:SimSun;font-size:12px;">var people = new Object(); people.age = 20; people.sayAge = function(){ alert(this.age); };</span

JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)

简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实现添加新产品而不影响已有代码?工厂方法模式应运而生,本文将介绍另外一种工厂模式--工厂方法模式. 1 日志记录器的设计 Sunny软件公司欲开发一个系统执行日志记录器(Logger).该记录器能够通过多种途径保存系统的执行日志,如通过文件记录或数据库记录,用户能够通过改动配置文件灵活地更换日志记录方式. 在设

设计模式之创建型工厂模式

通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例.创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象.定义一个创建对象的接口,让其子类决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行,最终生成复杂对象.主要解决接口选择的问题. 您需要一辆汽车,可以直接从工厂里提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现. var PageFactory = function(type, content) { if(this instan

设计模式-创建型-工厂模式

工厂设计模式: 顾名思义,该模式是用来生产对象的.在面向对象的设计模式中,万物皆对象,若使用new来创建对象,就会对该对象产生强耦合,加入我们需要更换该对象,那么使用该对象的对象都需要进行修改,这显然违背了开闭原则(OCP).如果我们使用工厂来产生对象,我们只需要与这个工厂打交道就可以了,无需关心具体的对象,达到解耦的目的. 接下来我们从实际的案例出发,从无工厂到有工厂的区别. 去披萨店订购披萨,首先披萨的种类很多(CheesePizza.GreekPizza.DurianPizza{等),披萨

04.创建型————创建者模式

package Create.d.Builder; //业务接口 public interface Tax { void calcTax(); } package Create.d.Builder; //业务接口 public interface Salary { void calcSalary(); } package Create.d.Builder; //业务实现类 public class HeBeiTax implements Tax { @Override public void c

创建型---prototype模式

代码: 1 package com.design; 2 import java.util.ArrayList; 3 4 /** 5 * 6 * @author Administrator 7 * 8 */ 9 class ConcretePrototype implements Cloneable { 10 /** 11 * 成员变量 12 * namelist 测试深拷贝 13 */ 14 private ArrayList<String> nameList = new ArrayList&