天天看点

面向对象设计模式学习笔记七Prototype原型模式

为什么需要原型模式

在软件系统中,经常面临着某些结构复杂的对象的创建工作;由于需求变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。

如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随需求改变而改变?

原型模式与工厂模式区别:

原型与工厂都是解决绕开new,来避免对象创建(new)过程 中所导致的紧耦合(依赖具体类),原型模式的特点在于对象的结构复杂。

什么是原型模式:

使用原型实例指定创建对象的种类,然后通过拷贝(深拷贝)这些原型来创建新的对象。

类图:

面向对象设计模式学习笔记七Prototype原型模式

实例:

//抽象类
class ISplitter{
public:
    virtual void split()=0;
    virtual ISplitter* clone()=0; //通过克隆自己来创建对象
    
    virtual ~ISplitter(){}

};
           
//具体类
class BinarySplitter : public ISplitter{
public:
	BinarySplitter()//自己实现深拷贝构造函数
	{
		
	}

    virtual ISplitter* clone(){
        return new BinarySplitter(*this);//通过拷贝构造函数深克隆
    }
private:
//
};

class TxtSplitter: public ISplitter{
public:
//自己实现深拷贝构造函数
    virtual ISplitter* clone(){
        return new TxtSplitter(*this);
    }
};

class PictureSplitter: public ISplitter{
public:
//自己实现深拷贝构造函数
    virtual ISplitter* clone(){
        return new PictureSplitter(*this);
    }
};

class VideoSplitter: public ISplitter{
public:
//自己实现深拷贝构造函数
    virtual ISplitter* clone(){
        return new VideoSplitter(*this);
    }
};
           
//客户程序-具体使用
class MainForm : public Form
{
    ISplitter*  prototype;//原型对象

public:
    
    MainForm(ISplitter*  prototype){
        this->prototype=prototype;//这里必须通过赋值使用
    }
    
	void Button1_Click(){

		ISplitter * splitter=//每一次buttonclick后都是创建了一个新的对象
            prototype->clone(); //克隆原型
        
        splitter->split();
        
        

	}
};
           

实例代码:https://blog.csdn.net/qq_29542611/article/details/79521841

继续阅读