你的位置:首页 > ASP.net教程

[ASP.net教程]ProtoType(原型)


1.意图

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

2.动机

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

3.适用性

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

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

4.结构

     

5.代码实例

    

#include <memory>class Prototype{public:  virtual std::shared_ptr<Prototype> Clone() = 0;  virtual void PrintState() = 0;  virtual void SetState(int state) = 0;};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(1));  std::shared_ptr<Prototype> ConcretePrototype2(new ConcretePrototype2(1));  pProtoTypeFactory->RegisterPrototype(1,pConcretePrototype1);  pProtoTypeFactory->RegisterPrototype(2,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(1);  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(3);  pClonedProtoType->PrintState();  std::cout << std::endl;  std::cout << std::endl;  std::cout << std::endl;  std::cout<< "Clone Prototype 2:" << std::endl;  pProtoType = pProtoTypeFactory->GetProtoType(2);  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(4);  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(1);  }    

Test.cpp

6.测试结果

    

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

7.效果

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



青海旅游景点推荐青海旅游团报价青海旅游团购优惠青海旅游线路报价青海旅游指南攻略大全2015深圳海上田园元旦活动?元旦海上田园门票优惠价格? 天冷了,给城市也穿上毛裤吧!(全文) 2015深圳欢乐谷元旦活动?元旦深圳欢乐谷门票优惠价格? 2015元旦深圳免费好玩景点有哪些?深圳元旦带孩子家人去什么地方好玩? 三亚到亚龙湾海底世界有车吗?三亚到亚龙湾海底世界怎么坐公交? 惠州小桂碧海湾景区游玩项目介绍?小桂碧海湾有什么? 亚龙湾海底世界沙滩介绍?三亚亚龙湾海底世界可以游泳吗? 惠州澳头小桂湾有什么玩的?惠州小桂湾漂流在哪里? 糖果KTV工体店:绝版青春主题活动 东寨港红树林自然保护区:国际重要湿地 北京周边10个骑马场盘点(9) “情侣洲”金沙岛:体现人与自然的最佳组合 马尔代夫浮潜会不会有鲨鱼? 8月份泰国天气如何?适合穿什么? 马尔代夫浮潜要注意什么? 去马尔代夫旅游买什么便宜? 552-0133F Datasheet 552-0133F Datasheet 552-0201 Datasheet 552-0201 Datasheet 552-0201F Datasheet 552-0201F Datasheet 大兴安岭跟团到香港旅游 大兴安岭跟团到香港旅游 大兴安岭跟团到香港旅游 包头跟团去香港旅游 包头跟团去香港旅游 包头跟团去香港旅游 黑龙江跟团港澳旅游 黑龙江跟团港澳旅游 黑龙江跟团港澳旅游