1.意图

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2.动机

通过拷贝或者“克隆”一个类的实例来创建新的实例。

3.适用性

当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype模式;以及

  • 当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者
  • 为了避免创建一个与产品类层次平行的工厂类层次时或者
  • 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。

4.结构

5.代码实例

#include <memory>

class Prototype
{
public:
virtual std::shared_ptr<Prototype> Clone() = ;
virtual void PrintState() = ;
virtual void SetState(int state) = ;
}; class ConcretePrototype1 : public Prototype
{
public:
ConcretePrototype1(int state);
std::shared_ptr<Prototype> Clone();
void PrintState();
virtual void SetState(int state);
private:
int m_iState;
}; class ConcretePrototype2 : public Prototype
{
public:
ConcretePrototype2(int state);
std::shared_ptr<Prototype> Clone();
void PrintState();
virtual void SetState(int state);
private:
int m_iState;
};

Prototype.h

#include<map>
#include<memory> class Prototype; class ProtoTypeFactory
{
public:
void RegisterPrototype(int key,std::shared_ptr<Prototype> pProtoType);
std::shared_ptr<Prototype> GetProtoType(int key);
void PrintAllPrototypeState();
private:
std::map<int,std::shared_ptr<Prototype>> m_ProtoTypeMap;
};

ProtoTypeFactory.h

#include "Prototype.h"
#include <iostream> ConcretePrototype1::ConcretePrototype1(int state) : m_iState(state)
{
} std::shared_ptr<Prototype> ConcretePrototype1::Clone()
{
std::shared_ptr<Prototype> pProtoType(new ConcretePrototype1(*this)); return pProtoType;
} void ConcretePrototype1::PrintState()
{
std::cout << " ConcretePrototype1 State is :" << m_iState <<std::endl;
} void ConcretePrototype1::SetState(int state)
{
m_iState = state;
} ConcretePrototype2::ConcretePrototype2(int state) : m_iState(state)
{
} std::shared_ptr<Prototype> ConcretePrototype2::Clone()
{
std::shared_ptr<Prototype> pProtoType(new ConcretePrototype2(*this)); return pProtoType;
} void ConcretePrototype2::PrintState()
{
std::cout << " ConcretePrototype2 State is :" << m_iState <<std::endl;
} void ConcretePrototype2::SetState(int state)
{
m_iState = state;
}

Prototype.cpp

#include "ProtoTypeFactory.h"
#include "Prototype.h"
#include <utility> void ProtoTypeFactory::RegisterPrototype(int key,std::shared_ptr<Prototype> pProtoType)
{
m_ProtoTypeMap[key] = pProtoType;
} std::shared_ptr<Prototype> ProtoTypeFactory::GetProtoType(int key)
{
auto iter = m_ProtoTypeMap.find(key);
return iter->second;
} void ProtoTypeFactory::PrintAllPrototypeState()
{
for(auto iter = m_ProtoTypeMap.begin(); iter != m_ProtoTypeMap.end();++iter)
{
iter->second->PrintState();
}
}

ProtoTypeFactory.cpp

#include "ProtoTypeFactory.h"
#include "Prototype.h"
#include <iostream> void RegisterPrototype(std::shared_ptr<ProtoTypeFactory> pProtoTypeFactory)
{
std::shared_ptr<Prototype> pConcretePrototype1(new ConcretePrototype1());
std::shared_ptr<Prototype> ConcretePrototype2(new ConcretePrototype2());
pProtoTypeFactory->RegisterPrototype(,pConcretePrototype1);
pProtoTypeFactory->RegisterPrototype(,ConcretePrototype2);
} int main()
{
std::shared_ptr<ProtoTypeFactory> pProtoTypeFactory(new ProtoTypeFactory()); std::cout<< "RegisterPrototype in PrototypeFactory";
std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl; RegisterPrototype(pProtoTypeFactory); std::cout<< "Print All State in PrototypeFactory:" << std::endl;
pProtoTypeFactory->PrintAllPrototypeState(); std::cout<< "Clone Prototype 1:" << std::endl;
auto pProtoType = pProtoTypeFactory->GetProtoType();
std::cout<< "Print State Before Set State" << std::endl;
auto pClonedProtoType = pProtoType->Clone();
pClonedProtoType->PrintState();
std::cout<< "Print State After Set State" << std::endl;
pClonedProtoType->SetState();
pClonedProtoType->PrintState(); std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl; std::cout<< "Clone Prototype 2:" << std::endl;
pProtoType = pProtoTypeFactory->GetProtoType();
std::cout<< "Print State Before Set State" << std::endl;
pClonedProtoType = pProtoType->Clone();
pClonedProtoType->PrintState();
std::cout<< "Print State After Set State" << std::endl;
pClonedProtoType->SetState();
pClonedProtoType->PrintState(); std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl; std::cout<< "Print All State in PrototypeFactory:" << std::endl;
pProtoTypeFactory->PrintAllPrototypeState(); while(); }

Test.cpp

6.测试结果

利用原型设计模式时,可以预先注册所需的原型,然后在使用时根据原型创建实例。

7.效果

  • 运行时刻增加和删除产品,Prototype允许只通过注册原型实例就可以将一个新的具体产品类并入系统。
  • 改变值以指定新对象
  • 改变结构以指定新对象
  • 减少子类的构造
  • 用类动态配置应用。

ProtoType(原型)-对象创建型模式的更多相关文章

  1. Prototype原型(创建型模式)

    依赖关系的倒置:抽象不应该依赖于实现的细节,实现细节应该依赖于抽象. 原型模式的定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.prototype模式允许一个对象再创建另外一个可 ...

  2. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

  3. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  4. 5.对象创建型模式-原型PROTOTYPE

    原型:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型实现:1.用于创建对象的具体类必须实现clone()操作,用于对象克隆自己以生成新的对象.下面通过原型来实现一个抽象工厂Ma ...

  5. 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

    意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...

  6. singleton(单件)-对象创建型模式

    1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.动机 对一些类来说,只有一个实例是很重要的.让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象 ...

  7. Singleton模式——对象创建型模式

    Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...

  8. Builder(生成器)-对象创建型模式

    一.意图 将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示. 二.动机 一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加.Bu ...

  9. 对象创建型模式------Builder(生成器)

    本文系转载,转载地址http://blog.sina.com.cn/s/blog_59b6af690100zj3l.html,只供自己学习使用. 假设现在有三种产品,是玩具,都是由三部分组成,头,身体 ...

随机推荐

  1. Unity3d 引擎原理详细介绍

    体系结构 为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则. Unity3D 引擎 Unity3D的是一个屡获殊荣的工具,用于 ...

  2. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  3. 黄聪:Wordpress二级域名共享用户cookie出现错误解决方案及WP的Cookie机制

    在若干年以前,我刚开始折腾Wordpress没多久的时候,就自己摸索过 多个Wordpress网站共享一份数据表的实现方法 .这种看起来好像很高大上的类SSO功能,能够给用户在多个网站之间提供快速.无 ...

  4. Hibernate5.2关联关系之单向一对多(一)

    Hibernate5.2之单向一对多 一. 简介    Hibernate中最复杂的应该就是各种关联(单向一对多.单向多对一.双向一对多.一对一.多对多)关系的映射,于是笔者就想着去写一些关于Hibe ...

  5. 【总结】我所整理的各种CSS居中

    在网上看了很多文章,自己也总结了一下,虽说是自己写的,但是还是要列出我参考过的那些文章的地址,感谢你们的分享!  http://blog.gejiawen.com/2015/03/13/css-lay ...

  6. C语言中数据类型取值范围的计算的理解与总结

    c语言中,数据类型有short,int,long,char,float,double,然后除了浮点型只有 有符号数(signed)外,其他的数据类型都分为有符号(signed)和无符号(unsigne ...

  7. java io流 创建文件、写入数据、设置输出位置

    java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...

  8. spring component-scan filter

    (参考的Spring version : 4.1.6.RELEASE) 我们通常会使用component-scan来进行bean的加载,但是它里面的实现机制却是一知半解.根据原码来理解一下,可能会更加 ...

  9. java和Javascript的区别

    1 首先,这两个家伙没有任何的血缘关系,java是是由Sun 公司于1995年5月推出的,而javascript是于1995年由Netscape公司设计实现而成的,由于Netscape公司与Sun公司 ...

  10. ORACLE8.07客户端配置指南

    —本地机器网络连通配置 1.点击“开始”-〉“程序”菜单. 2.选择“Oracle-OracleHome81”-〉“Net Administrator”->“Net8 Configuration ...