23 DesignPatterns学习笔记:C++语言实现 --- 1.5 Prototype

2016-07-21

(www.cnblogs.com/icmzn)



模式理解

1. Prototype  原型模式定义
    提供了类的自我复制的能力,即通过已有对象进行新对象的创建。因为原型模式实在内存中进行二进制流的拷贝,
所以比直接通过new 一个对象性能好。不同的实现方式与具体的语言相关。

2. 原型模式的优点
(1)性能优良,实在内存中基于二进制的拷贝
(2)在进行原型模式的时候,并不通过构造函数。

3. 原型模式的适用场景
(1)需要根据已有对象创建大量的对象;
(2)某个对象的创建需要有大量的前期准备,需要等待其他模块准备完毕;
(3)把相同的对象付给其他对象处理。

4. 原型模式的讨论与注意问题
(1)原型模式注意浅层拷贝与深层拷贝
    语言基础类型浅层拷贝,指针、引用浅层拷贝只传递地址内容需要注意
    C++:需要依赖类的复制构造函数实现
(2)这就是需要提到对象的复制问题

* 类成员是new 多态创建的类成员,要进行深层拷贝,同时要在~XX析构函数中进行析构处理。
* 当记性赋值操作是即=(),右边是一个临时由于运算产生的临时对象,则可以执行高效的赋值操作,即将成员指正直接指向“临时对象”内的成员地址位置,
然后,将“临时对象”的成员指针设置为nullptr,即可。《移动赋值构造》
 原型:
 CXXObject(const CXXObject && LinShi)
  {//移动构造函数
    m_pName = Linshi.m_pName;
    LinShi.m_pName = nullptr;

}
 (3)实际上,Prototype, Builder, Abstract Factory都是通过一个类(对象) 来创建其他类
但是,他们之间有侧重之分。
builder 侧重对象的构建过程,并不直接返回类对象,由监管者Director协调具体的Builder类分别根据不同的构建过程创建对象;
Abstract Factory 侧重于具体的工厂创建本类型的不同对象,并且是直接返回对象;
Prototye 侧重根据一个对象返回这个对象的副本,必须注意深度拷贝。 



程序实现(C++)

Prototype.h

 1 #pragma once
 2
 3 #include <string>
 4 #include <iostream>
 5 #include <vector>
 6 class CAbsPrototype
 7 {
 8 public:
 9     CAbsPrototype();
10     ~CAbsPrototype();
11 public:
12     virtual CAbsPrototype* clone() const;
13 };
14
15
16 class CConcentPrototype : public CAbsPrototype
17 {
18 private:
19     //语言基础类型浅层拷贝,指针、引用浅层拷贝只传递地址内容需要注意
20     int m_iAge;
21     char* m_pName;//深层拷贝,构造冲初始化,系统中保持协调洗头
22     std::vector<double> m_dScores;
23
24
25 public:
26     // 注意,没有默认值得形参需要排在有默认值的前面,必然的原因
27     CConcentPrototype(const std::vector<double>& socresV, const char* aName = "Default Name", int age = 18) :m_iAge(age)
28     {
29         m_pName = nullptr;
30
31         int l = strlen(aName) + 1;
32         m_pName = new char[l];
33         strcpy_s(m_pName, l, aName);
34
35         //m_dScores.reserve(socresV.size());
36         m_dScores = socresV;
37         std::cout << "一般构造函数执行。" << std::endl;
38     }
39     ~CConcentPrototype()
40     {
41         delete[] m_pName;
42     }
43     CConcentPrototype(const CConcentPrototype& obj)//复制构造函数
44     {
45         m_iAge = obj.m_iAge;
46
47         int l = strlen(obj.m_pName) + 1;
48         m_pName = new char[l];
49         strcpy_s(m_pName, l, obj.m_pName);
50
51         m_dScores.clear();
52         m_dScores = obj.m_dScores;
53         std::cout << "复制构造函数执行。" << std::endl;
54     }
55     //要考虑深层拷贝与浅层拷贝
56     CAbsPrototype* clone() const override;
57     void outPut()
58     {
59         std::cout << m_pName << m_iAge << "  score:";
60
61         for (auto t : m_dScores)
62             std::cout << t << "   ";
63             std::cout << std::endl;
64     }
65
66 };

Prototype.cpp

 1 #include "AbsPrototype.h"
 2
 3
 4 CAbsPrototype::CAbsPrototype()
 5 {
 6 }
 7 CAbsPrototype::~CAbsPrototype()
 8 {
 9 }
10
11 CAbsPrototype* CAbsPrototype::clone() const
12 {
13     return nullptr;
14 }
15
16
17 //
18 CAbsPrototype* CConcentPrototype::clone() const
19 {
20     //利用复制搞糟函数实现 Prototype 模式
21     CConcentPrototype* p = new CConcentPrototype(*this);
22     return p;
23     //子类指针,赋值给父类指针,在调用处转化为子类指针
24 }


(1)模板应用

main.cpp

 1 // Prototype.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include "AbsPrototype.h"
 6 #include <iostream>
 7
 8
 9 int _tmain(int argc, _TCHAR* argv[])
10 {
11     std::vector<double> scores{11.2, 33.4, 45.6, 99.9};
12     CConcentPrototype* pObj = new CConcentPrototype(scores, "zhongguo", 26);
13     pObj->outPut();
14
15     std::cout << "-----------------" << std::endl;
16     for (int i = 0; i < 10; i++)
17     {
18         CConcentPrototype* pTem = (CConcentPrototype*)pObj->clone();
19         pTem->outPut();
20     }
21
22     system("pause");
23     return 0;
24 }

(2)输出展示

 

时间: 2024-10-16 09:12:06

23 DesignPatterns学习笔记:C++语言实现 --- 1.5 Prototype的相关文章

23 DesignPatterns学习笔记:C++语言实现 --- 2.7 Proxy

2016-07-18 (www.cnblogs.com/icmzn) 模式理解   1. Proxy 代理模式    为其他对象提供一种代理可以间接控制这个对象的访问.    又称为“委托模式”,其他设计模式也是在代理模式的基础上扩展的,如“策略模式”“状态模式”“访问者模式”,代理模式的特殊应用.在Spring的AOP技术,以及Struts的From元素映射就是代理行为.    一般代理具有多种版本(扩展)如:普通代理模式,强制代理模式,动态代理模式    一般代理的角色:    (1)CAb

23 DesignPatterns学习笔记:C++语言实现 --- 2.4 Composite

2016-07-22 (www.cnblogs.com/icmzn) 模式理解   1. Composite组合模式    又称为部分整体模式,主要用来描述部分与整体的关系.    将对象组合成树状结构以表示“部分-整体”的层次结构,是用户对“单个对象”和“组合对象”的使用具有一致性.    一般该模式具有三个角色:    (1)AbsComponent角色:一般为抽象父类,抽象“单个对象”“组合对象”公共的行为和方法,可以提供一些默认的方法或行为实现.    (2)Leaf角色:描述的是“单个

23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade

2016-07-22 (www.cnblogs.com/icmzn) 模式理解   1. 门面模式 facade ,又称为外观模式    要求所有外部与一个子系统的所有通信必须通过一个“统一的对象”进行.这个对象就是子系统的“门面”,即门面提供一个统一的调用接口,使得    子系统能够简单使用.    门面模式注重“统一的对象”,除了这个统一的对象外,不允许以其他方式调用子系统的行为发生.子系统可以是一个类对象或者一组对象的集合,更直观的    讲不管子系统内是多么杂乱无章,只要“统一对象”是简

23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter

2016-07-22 (www.cnblogs.com/icmzn) 模式理解 1. Adapter 定义    将一个类的接口变换为客户端所期待的另一种接口形式,使被适配者Adaptee能用用在目标target的环境中    一般可以分为以下角色:    (1)Target角色:        定义把其他类或者对象转化为的目标接口.通常为一个抽象类(接口).    (2)Adaptee角色:        定义被转化的类,它是已经存在的类或者对象    (3)Adapte角色:        

23 DesignPatterns学习笔记:C++语言实现 --- 2.1 Bridge

2016-07-22 (www.cnblogs.com/icmzn) 模式理解   1. Bridge模式的定义    将抽象与实现解耦,使两个可以独立的发生变化.桥接模式的重点在“解耦”.    一般桥接模式有以下四个角色    (1)“抽象角色的抽象”:通过组合保留“实现橘色”的引用.    (2)具体的“抽象角色”:通过组合引用的实现类,对实现类抽象进行操作处理.    (3)“实现角色的抽象”:抽象类,定义实现角色必须的动作和行为.    (4)具体的实现角色:完成实现类角色抽象的具体的

23 DesignPatterns学习笔记:C++语言实现 --- 2.5 Factory

2016-07-18 (www.cnblogs.com/icmzn) 模式理解   1. Flyweight 模式,即享元(共享单元)模式    Flyweeight是拳击比赛中的特有名词,称为“特轻量级别”,则在设计模式中指的的是类要轻量.类的粒度要细,可以实现细粒度类的复用,但没有缺乏共享的机制,即多线程下类不可复用.    享元模式,是“池技术”的重要实现方式,但二者并不等价.使用享元模式可以支持大量的细粒度的对象的共享.    因为创建太多的对象到程序中有损程序的性能,可以采用享元模式的

IOS学习笔记---C语言第四天

1 //?生成2个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相 加,放到另外?一个数组中 2 #import <Foundation/Foundation.h> 3 4 int main(int argc, const char * argv[]) 5 { 6 7 int num1[10]={0},num2[10]={0},num3[10]={0}; 8 for (int i = 0; i<10; i++) { 9 num1[i]=arc4random()%2

iOS学习笔记---c语言第十一天

函数指针 一.函数指针定义 //函数声明:声明我是一个什么函数 //求两个数的和 //函数的类型:int (int x,int y) //即:我是一个返回值为整型,有两个整型参数的函数. //函数名是 sum int sum(int x,int y); 函数指针定义p是变量,其他是类型(通常没有形参a,b) //函数指针类型 int (*)(int x,int y) //描述:指向 返回值为 int 两个int参数 的 指针类型 //函数指针变量: p //初始值 : sum printf("%

iOS学习笔记---c语言第九天

高级指针 指向结构体变量的指针,称为结构体指针 可以使用->指向内容. %p打印地址 void pLenth(cPoint *p1,cPoint *p2) //求两点间的距离  用的开方函数sqrt()和平方函数pow(,) { float a = sqrt(pow((p1->x-p2->x), 2)+pow((p1->y-p2->y), 2)); printf("两点距离为%.2f\n",a); } //main.m中代码 #import <Fou