设计模式学习总结:(8)原型模式

原型(prototype)模式和工厂方法模式很像,也是为了在对象创建的时候更加灵活。但是,不同的地方是,原型模式是工厂和相应类对象的结合体,通过在类中定义一个clone方法用来克隆自己,这样的类也被称为原型。对比工厂方法,可以想到有这样的好处,省略了工厂类的定义实现,简化了创建实例的过程,因为只要复制构造就行了。当然,缺点也是有的,把clone的职责给了原型类,实际上也是增加了类的职责,

意图:

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

通过已有对象来创建新的对象是它的特点

结构图:

改写工厂方法模式:

class AbProduct
{
public:
    virtual void sayName()=0;
    AbProduct(string name) :_name(name){}
    virtual ~AbProduct(){}
    virtual AbProduct *clone()=0;
protected:
    string _name;
};

class DBProduct:public AbProduct
{
public:
    DBProduct(string name) :AbProduct(name){}
    DBProduct(const DBProduct &product) :AbProduct(product._name){}
    ~DBProduct(){}
    void sayName();
    virtual AbProduct *clone();
private:

};
AbProduct * DBProduct::clone()
{
    return new DBProduct(*this);
}

void DBProduct::sayName()
{
    cout << _name << endl;
}
class TextProduct:public AbProduct
{
public:
    TextProduct(string name) :AbProduct(name){}
    TextProduct(const TextProduct &product) :AbProduct(product._name){}
    ~TextProduct(){}
    void sayName();
    virtual AbProduct *clone();
private:

};
AbProduct * TextProduct::clone()
{
    return new TextProduct(*this);
}
void TextProduct::sayName()
{
    cout << _name << endl;
}

具体的用处:

class BigClient
{
    AbProduct *_prototype;
public:
    BigClient(AbProduct * prototype) :_prototype(prototype){}
    ~BigClient(){ delete _prototype; }
    void operation()
    {
        AbProduct *p = _prototype->clone();
        p->sayName();
        delete p;
    }
};

结果:

在BigClient中,第一次创建传入的对象将作为以后的clone原型。

时间: 2024-11-21 03:17:42

设计模式学习总结:(8)原型模式的相关文章

设计模式学习03—抽象工厂模式

1.动机与定义 工厂模式中,一个工厂仅仅能提供一个或一类产品,当产品种类较多,形成产品系列(比方我们要创建跨平台的button,菜单,文本框等等一系列GUI控件: 单纯使用工厂模式会产生大量工厂,并且后期维护也不方便,我们能够从产品中找到规律,假设产品等级相对固定,以后仅仅会新增产品族,那么我们就能够把整个产品族放到一个工厂创建,以后新增其它系统产品族也很方便,例如以下图: 这样的模式就是抽象工厂,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则须要面对多个产品等级结构,一个工厂等级结构能

Java设计模式(三)原型模式

(五)原型模式 Prototype 原型模式目的是复制一个现有对象来生成新的对象,而不是通过实例化的方式.原型模式需要实现 Cloneable 接口,覆写clone方法,复制分为浅复制.深复制. 浅复制:将一个对象复制后,基本数据类型的变量都重新创建,引用类型,指向的还是原对象所指向的. 深复制:讲一个对象复制后,不论基本数据类型和引用类型,都是重新创建,是完全的彻底的复制. public class ProtoType { public static void main(String[] ar

设计模式学习(二)-简单工厂模式

---恢复内容开始--- 简单工厂设计模式 简单工厂模式定义: 简单工厂设计模式又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 简单工厂主要分为如下几个角色 抽象产品(abstract product):为所有具体产品的抽象表现,一般为抽象类 具体产品(product):为抽象产品的具体实现 生成产品工厂(facto

设计模式(创建型)之原型模式(Prototype Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! 概述 原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过

Android设计模式(三)- 原型模式

原型模式也是一种创建型设计模式,从名字就能理解,这个模式应该有一个样板实例,也就是原型,然后用户从这个原型中复制出一个内部属性一致的实例,也就是克隆. 有时,一个对象的构造比较复杂并且比较耗时时,直接从已有对象复制一个实例比重新构造出来更高效. 简书地址 定义 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 使用场景 对象的初始化要消耗非常多的资源,包括硬件,数据等.可以使用原型模式避免这种资源的消耗. 用new来实例化一个对象时需要非常繁琐的数据准备或访问权限时,可以使用原型模

设计模式(四)原型模式Prototype(创建型)

1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象. 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮寄给另外一个地址,这里是邮寄地址……”顾客一边说一边把

设计模式学习笔记--工厂方法模式

学习过简单工厂模式,感觉很好用.在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码.大大的减少了代码修改的难度.而且可以通过参数不同,创建不同的对象. 但是简单工厂模式也有一些弊端,违背了开放--封闭原则.即如果我们增加了一个产品,对应的工厂也要进行修改,即switch---case中要新增加一些分支条件,不利于扩展.所以就有了下面的工厂方法模式: 工厂方法模式:定义了一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到子类. // 设计模式Dem

设计模式学习笔记--备忘录(Mamento)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--状态(State)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--迭代(Iterator)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这