在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
参考:https://www.cnblogs.com/carsonzhu/p/5774616.html 尽管和工厂模式相类似是创建型设计模式的一种,原型模式本身与工程设计模式本身并没有什么关系,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。 原型模式的应用场景: 1.当我们的对象类型不是开始就能确定的,而这个类型是在运行期确定的话,那么我们通过这个类型的对象克隆出一个新的对象比较容易一些; 2..有的时候,我们需要一个对象在某个状态下的副本,此时,我们使用原型模式是最好的选择;例如:一个对象,经过一段处理之后,其内部的状态发生了变化;这个时候,我们需要一个这个状态的副本,如果直接new一个新的对象的话,但是它的状态是不对的,此时,可以使用原型模式,将原来的对象拷贝一个出来,这个对象就和之前的对象是完全一致的了; 3.当我们处理一些比较简单的对象时,并且对象之间的区别很小,可能就几个属性不同而已,那么就可以使用原型模式来完成,省去了创建对象时的麻烦了; 4.有的时候,创建对象时,构造函数的参数很多,而自己又不完全的知道每个参数的意义,就可以使用原型模式来创建一个新的对象,不必去理会创建的过程。
一.C++代码 1 #include <iostream> 2 3 using namespace std; 4 5 class IPrototype{ 6 public: 7 IPrototype(){} 8 virtual ~IPrototype(){} 9 virtual IPrototype* clone()=0; 10 }; 11 12 class ConcretePrototype:public IPrototype 13 { 14 private: 15 int m_counter; 16 public: 17 ConcretePrototype(){ 18 m_counter = 0; 19 } 20 21 //拷贝构造函数 22 ConcretePrototype(const ConcretePrototype& rhs){ 23 m_counter = rhs.m_counter; 24 } 25 26 virtual ~ConcretePrototype(){} 27 28 virtual ConcretePrototype* clone(){ 29 m_counter ++; 30 return new ConcretePrototype(*this); 31 } 32 33 int getCounter(){ 34 return m_counter; 35 } 36 }; 37 38 int main() 39 { 40 ConcretePrototype* c1 = new ConcretePrototype(); 41 cout<<"当前拷贝次数"<<c1->getCounter()<<endl; 42 ConcretePrototype* c2 = c1->clone(); 43 cout<<"当前拷贝次数"<<c1->getCounter()<<endl; 44 cout<<"当前拷贝次数"<<c2->getCounter()<<endl; 45 return 0; 46 }
二.Java代码 Java实现原型模式很简单,只需要实现cloneable接口的类都可以作为原型类,其中clone方法可以由开发者重写 1 public class Prototype implements Cloneable { 2 3 private int counter; 4 5 @Override 6 public Prototype clone() throws CloneNotSupportedException { 7 counter++; 8 return (Prototype) super.clone(); 9 } 10 11 public int getCounter(){ 12 return this.counter; 13 } 14 15 } 16 17 public class Main { 18 19 public static void main(String[] args) { 20 try{ 21 Prototype prototype1 = new Prototype(); 22 System.out.println("当前拷贝次数" + prototype1.getCounter()); 23 Prototype prototype2 = prototype1.clone(); 24 System.out.println("当前拷贝次数" + prototype1.getCounter()); 25 System.out.println("当前拷贝次数" + prototype2.getCounter()); 26 } catch (CloneNotSupportedException e){ 27 e.printStackTrace(); 28 } 29 } 30 } 输出: 当前拷贝次数0 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论