常见设计模式之(九):原型模式

文章目录

  • 常见设计模式之(九):原型模式
    • 1 什么是原型模式(Prototype pattern)?
    • 2 c++实现
      • 2.1 通用类图
      • 2.2 c++实现
    • 3 总结
      • 3.1 原型模式的优缺点
      • 3.2 原型模式的使用场景
      • 3.3 与建造者模式、工厂模式的区别
    • 4 题外话
    • 参考

常见设计模式之(九):原型模式

1 什么是原型模式(Prototype pattern)?

摘自 java 设计模式官网 中 有关原型模式的定义:

Specify the kinds of objects to create using a prototypical instance,and create new objects by
copying this prototype

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

2 c++实现

2.1 通用类图

常见设计模式之(九):原型模式_第1张图片

2.2 c++实现

AbstractPrototype.h

#ifndef ABSTRACT_PROTOTYPE_H
#define ABSTRACT_PROTOTYPE_H


class AbstractPrototype
{
public:
    AbstractPrototype()
    {

    }
    virtual ~AbstractPrototype()
    {

    }
    virtual AbstractPrototype * Clone(void) = 0;
};

#endif

ConcretePrototype.cpp

#ifndef CONCRETE_PROTOTYPE_H
#define CONCRETE_PROTOTYPE_H

#include 
#include "AbstarctPrototype.h"

class ConcretePrototype : public AbstractPrototype
{
public:
	ConcretePrototype()
    {

    }
	virtual ~ConcretePrototype()
    {

    }
 
	//复制自身
	virtual ConcretePrototype * Clone()
	{
		//调用拷贝构造函数
		return new ConcretePrototype(*this);
	}
 
private:
	//拷贝构造函数  应该 区分深拷贝和浅拷贝
	ConcretePrototype(const ConcretePrototype & rproto)
	{
		m_test1 = rproto.m_test1;
		std::cout<<"克隆中。。。。"<

ClientPrototype.cpp

#include "AbstarctPrototype.h"
#include "ConcretePrototype.h"

int main(void)
{
    AbstractPrototype * cls_proto = new ConcretePrototype();
    AbstractPrototype * cls_concrete = cls_proto->Clone();
    delete cls_concrete;
    delete cls_proto;
}

编译并运行:

root@wan:/wan/09Prototype# make ClientPrototype
g++     ClientPrototype.cpp   -o ClientPrototype
root@wan:/wan/09Prototype# ./ClientPrototype
克隆中。。。。

3 总结

3.1 原型模式的优缺点

  • 性能优良
    原型模式是在内存二进制流的拷贝, 要比直接new一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时, 原型模式可以更好地体现其优点。
  • 逃避构造函数的约束
    这既是它的优点也是缺点, 直接在内存中拷贝, 构造函数是不会执行的优点就是减少了约束, 缺点也是减少了约束, 需要大家在实际应用时考虑。

3.2 原型模式的使用场景

  • 资源优化场景
    类初始化需要消化非常多的资源, 这个资源包括数据、 硬件资源等。
  • 性能和安全要求的场景
    通过new产生一个对象需要非常繁琐的数据准备或访问权限, 则可以使用原型模式。
  • 一个对象多个修改者的场景
    一个对象需要提供给其他对象访问, 而且各个调用者可能都需要修改其值时, 可以考虑使用原型模式拷贝多个对象供调用者使用。

3.3 与建造者模式、工厂模式的区别

Prototype 模式通过复制原型(Prototype)而获得新对象创建的功能,这里 Prototype 本身就是“对象工厂”(因为能够生产对象), 实际上 Prototype 模式和 Builder 模式、AbstractFactory 模式都是通过一个类(对象实例) 来专门负责对象的创建工作(工厂对象),它们之间的区别是: Builder 模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory 模式重在产生多个相互依赖类的对象,而 Prototype 模式重在从自身复制自己创建新类。

4 题外话

原型模式在c++的实现过程中主要涉及的技术就是深拷贝和浅拷贝、赋值构造函数、拷贝构造函数,本文暂时不对这些问题进行讨论。

参考

《设计模式之禅第二版》

你可能感兴趣的:(设计模式和设计原则)