Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式:原型模式

设计模式:原型模式

作者头像
王强
发布于 2020-09-24 07:36:20
发布于 2020-09-24 07:36:20
60900
代码可运行
举报
文章被收录于专栏:Python爬虫实战Python爬虫实战
运行总次数:0
代码可运行

系列文章回顾

┣ 设计模式:简单工厂模式

┣ 设计模式:工厂方法模式

┣ 设计模式:抽象工厂模式

┣ 设计模式:单例模式

┣ 设计模式:建造者模式

1 概述

原型模式使用原型实例指定创建对象的种类,并且通过拷贝原型对象创建新的对象。原型模式的关键点在于原型实例与实例的复制,实例的克隆分为深拷贝与浅拷贝。

  • 浅拷贝:对于字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象与其副本引用同一对象。
  • 深拷贝:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

原型模式使用的是深拷贝, 使用原型模式复制对象不会调用类的构造方法。

2 图解

01_Prototype

原型模式包含三种角色:

  • Prototype(原型):定义用于复制现有实例来生成新实例的方法。
  • ConcretePrototype(具体原型):负责实现复制现有实例并生成新实例的方法。
  • Client(使用者):负责使用复制实例的方法生成新实例。

3 优缺点

优点:

  • 性能提高,直接拷贝内存里内容比直接新建实例节省资源;
  • 简化对象创建,避免了构造函数的约束,不受构造函数的限制直接复制对象;
  • 可通过深克隆的方式保存对象的状态,可以辅助实现撤销操作。

缺点:

  • 需要为每个类准备一个克隆方法,该方法位于类的内部,当对已有类进行改造时,需要修改原代码,违背了开闭原则;
  • 在实现深拷贝时需要写较复杂的代码,如果对象之间存在多重嵌套引用时,为了实现深拷贝,每一层对象对应的类必须支持深拷贝,实现比较麻烦。

4 应用场景

  • 资源优化场景:类初始化需要消耗非常多的资源,原型模式避免了此类消耗;
  • 性能和安全要求的场景:通过new产生一个对象需要非常繁琐的数据准备或访问权限时,可以使用原型模式;
  • 一个对象多个修改者的场景:一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以使用原型模式拷贝多个对象供调用者使用;
  • 系统要保存对象的状态,而对象的状态变化很小。

5 实例

02_Prototype_UML

5.1 Python 实现

  • prototype.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#-*- coding: utf-8 -*-

'''
  原型模式
'''

from copy import copy, deepcopy

class Prototype(object):
    """原型类"""
    def __init__(self):
        super(Prototype, self).__init__()

    def clone(self):
        pass

class ConcretePrototype1(Prototype):
    """具体原型类"""
    def __init__(self):
        print("Create ConcretePrototype1")

    def clone(self):
        print("Copy ConcretePrototype1...")
        return deepcopy(self)

class ConcretePrototype2(Prototype):
    """具体原型类"""
    def __init__(self):
        print("Create ConcretePrototype2")

    def clone(self):
        print("Copy ConcretePrototype2...")
        return deepcopy(self)

if __name__ == '__main__':
    p1 = ConcretePrototype1()
    cp1 = p1.clone()

    p2 = ConcretePrototype2()
    cp2 = p2.clone()

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Create ConcretePrototype1
Copy ConcretePrototype1...
Create ConcretePrototype2
Copy ConcretePrototype2...

5.2 C++ 实现

  • prototype.h
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef PROTOTYPE_H
#define PROTOTYPE_H

#include <iostream>

using namespace std;

class Prototype
{
public:
    virtual ~Prototype() {}
    virtual Prototype* clone() const = 0;

protected:
    Prototype() {}
};

class ConcretePrototype1 : public Prototype
{
public:
    ConcretePrototype1() {
        cout << "Create ConcretePrototype1." << endl;
    }

    ConcretePrototype1(const ConcretePrototype1& other) {
        cout << "Copy ConcretePrototype1..." <<endl;
    }
    ~ConcretePrototype1() {}

    ConcretePrototype1* clone() const {
        return new ConcretePrototype1(*this);
    }
};

class ConcretePrototype2 : public Prototype
{
public:
    ConcretePrototype2() {
        cout << "Create ConcretePrototype2." << endl;
    }

    ConcretePrototype2(const ConcretePrototype2& other) {
        cout << "Copy ConcretePrototype2..." <<endl;
    }
    ~ConcretePrototype2() {}

    ConcretePrototype2* clone() const {
        return new ConcretePrototype2(*this);
    }
};

#endif // PROTOTYPE_H
  • main.cpp
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include "prototype.h"

using namespace std;

int main()
{
    Prototype* p1 = new ConcretePrototype1();
    Prototype* cp1 = p1->clone();

    Prototype* p2 = new ConcretePrototype2();
    Prototype* cp2 = p2->clone();

    delete p1;
    delete cp1;
    delete p2;
    delete cp2;

    return 0;
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Create ConcretePrototype1.
Copy ConcretePrototype1...
Create ConcretePrototype2.
Copy ConcretePrototype2...

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C与Python实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
原型模式(Prototype)
原型模式(Prototype) 原型模式(Prototype) 意图:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。 应用:Java/C#中的Clonable和IClonable接口
Florian
2018/02/05
5940
原型模式(Prototype)
面向对象设计模式--原型模式详解+实际应用(Java)
原型模式解决从1到N个对象的生成,不负责生成第一个对象实例。原型模式可以通过直接复制内存的方式生成一个新的对象实例,与原有的对象实例的内容都相同,它省去了通过构造函数生成对象实例的步骤,省去了每个属性的赋值逻辑。如果构造函数中没有任何逻辑,则new方法要比clone方法快;但是,只要构造函数中有一点点逻辑,则clone方法就要比new快很多了,而且还没有考虑对象的内部属性进行赋值的逻辑时间。
飞天葫芦侠
2023/03/23
15.5K0
面向对象设计模式--原型模式详解+实际应用(Java)
设计模式之八(原型模式)
ConcretePrototype1,ConcretePrototype2具体原型类,实现一个克隆自身的操作
aehyok
2018/09/11
2810
设计模式之八(原型模式)
【设计模式】—— 原型模式Prototype
  模式意图   由于有些时候,需要在运行时指定对象时哪个类的实例,此时用工厂模式就有些力不从心了。通过原型模式就可以通过拷贝函数clone一个原有的对象,给现在的对象使用,从而创建更多的同类型的对象
用户1154259
2018/01/18
5270
【设计模式】—— 原型模式Prototype
设计模式之原型模式(Prototype 模式)
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
海盗船长
2021/12/07
3980
设计模式之原型模式(Prototype 模式)
设计模式 -- 原型模式
这里的复制指深复制 关于深浅复制传送门 深复制就是开辟新内存实现真正的内存复制 浅复制, 只复制指针, 堆内存不变.
xy_ss
2023/11/22
1720
设计模式 -- 原型模式
设计模式——原型模式
设计模式——原型模式
Java架构师必看
2021/05/14
3210
设计模式——原型模式
[设计模式]原型模式
根据给定的文章内容,撰写摘要总结。
静默虚空
2018/01/05
5780
[设计模式]原型模式
Python 设计模式—原型模式
浅拷贝(Shallow Copy):指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝的对象和源对象只是名称相同,但是他们共用一个实体。 浅拷贝会拷贝对象内容及其内容的引用或者子对象的引用,但不会拷贝引用的内容和子对象本身。
Wu_Candy
2022/07/04
2410
原型模式
概念: 是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的原型。 原型模式的拷贝:分为"浅拷贝"和"深拷贝"。(这个和我们理解的拷贝是一样的) 浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象. 深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制. 组成 原型模式涉及到三个角色: (1)客户(Client)角色:客户类提出创建对象的请求。 (2)抽象原型(Prototype)
xiangzhihong
2018/02/05
5390
原型模式
大牧絮叨设计模式:原型模式
原型模式(Prototype)[GOF95]是一种对象的创建模式,通过给定一个参考的原型对象来指定要创建的对象的类型及数据,然后复制该对象创建更多的相同对象的方式完成对象的构建过程。
大牧莫邪
2019/07/23
3860
大牧絮叨设计模式:原型模式
设计模式——原型模式
设计模式中,单例模式应该是大家最为熟悉的了,那如果我们需要对一个对象进行多次复制的话,大家会用什么呢?这就要用到今天要讲的原型模式了。
健程之道
2019/11/02
4340
重温设计模式 --- 原型模式
原型模式是一种创建型设计模式,它允许我们创建一个对象的副本,而不需要显式地使用构造函数来创建一个新的对象。这种模式通常用于创建那些具有复杂创建过程或需要大量资源的对象。
Niuery Diary
2023/10/22
1860
重温设计模式 --- 原型模式
【地铁上的设计模式】--创建型模式:原型模式
原型模式是一种创建型设计模式,它通过复制现有对象来创建新对象。该模式基于一个原型对象,通过克隆来创建新的对象,避免了创建过程中的复杂配置。原型模式分为浅拷贝和深拷贝两种类型,浅拷贝只复制对象的基本类型数据和引用类型的引用,而深拷贝则复制了整个对象,包括对象内部的引用类型。原型模式适用于需要创建大量相似对象的场景,可以提高代码复用性,减少对象创建的开销。
喵叔
2023/04/28
1780
【设计模式 06】原型模式
原型模式是通过复制已有对象来快速创建新对象的方法,它适用于创建那些实例化很慢的对象,比如数据库连接对象,在创建好这样的对象后,我们可以缓存一份,下次需要这种对象时,我们可以直接返回一个该对象的拷贝。
JuneBao
2022/10/26
1750
设计模式(四)原型模式Prototype(创建型)
通过复制(克隆、拷贝)一个指定类型的对象来创建更多同类型的对象。这个指定的对象可被称为“原型”对象,也就是通过复制原型对象来得到更多同类型的对象。即原型设计模式。在php的很多模板库,都用到clone。如smarty等。
黄规速
2022/04/14
2660
设计模式(四)原型模式Prototype(创建型)
Java 设计模式系列(6) —— 原型模式
当拷贝对象时,拷贝的对象只包含简单的数据类型,或不可变对象时,就直接将这些字段复制到新对象中 但是如果拷贝对象中包含引用对象时,只拷贝引用对象的地址而不拷贝整个被引用的对象被称为浅拷贝,如果新开辟一块内存区域,将整个引用对象都拷贝一份,我们称之为深拷贝。
求和小熊猫
2021/01/06
2900
PHP设计模式之原型模式
原型模式其实更形象的来说应该叫克隆模式。它主要的行为是对对象进行克隆,但是又把被克隆的对象称之为最初的原型,于是,这个模式就这样被命名了。说真的,从使用方式来看真的感觉叫克隆模式更贴切一些。
硬核项目经理
2019/08/30
5340
PHP设计模式之原型模式
04.原型模式设计思想
本文详细介绍了原型模式的设计思想,包括其定义、应用场景、实现原理及优缺点。通过邮件复制的例子,阐述了原型模式如何通过克隆现有对象来创建新对象,从而提高性能和减少代码复杂度。文章还对比了原型模式与工厂模式的区别,并讨论了深克隆和浅克隆的实现方式。最后,总结了原型模式在特定场景下的应用价值和局限性。
杨充
2024/10/22
1340
JAVA设计模式4:谈谈原型模式在JAVA实战开发中的应用
本文讲解了 Java 设计模式中的原型模式,并给出了样例代码,原型模式的主要目的是通过复制或克隆现有对象来创建新对象,而无需依赖于显式的实例化过程。
Designer 小郑
2024/05/26
2100
JAVA设计模式4:谈谈原型模式在JAVA实战开发中的应用
相关推荐
原型模式(Prototype)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验