当前位置:   article > 正文

c++设计模式之概括--构造型模式_c++构造型

c++构造型

###########################
author: hjjdebug
date: 2020-03-09 20:21:26
###########################

c++设计模式之概括–构造型模式
构造型模式有5种,工厂方法模式,虚拟工厂模式,单例模式,原型模式,构建者模式.
她们的共同特点是封装了产品的构建过程. 简述如下:

工厂方法模式:

用工厂来创造产品.
工厂方法模式用法:
实例代码:

 Factory* fac = new ConcreteFactory();	//一个虚工厂指针指向实际工厂
 Product* p = fac->CreateProduct();		//一个虚产品指向工厂创造的产品.
  • 1
  • 2

问:
工厂方法与new 产品有什么不同?
答:
不能用new Product, 因为Product 是虚的.
而用 new ConcreteProduct, 则限定了只能是一种具体的产品.
而工厂方法的product, 却可以执行任何一种具体的产品, 前提是看看具体的工厂是谁.
工厂方法没有解决具体指向那个产品问题. 需要用户程序选定具体工厂来确定.

抽象工厂模式:

用工厂来创造一系列产品
与工厂方法一致,只不过这次工厂可以生产很多产品

实例代码:

 Factory* fac = new ConcreteFactory();	//一个虚工厂指针指向实际工厂
 Product1* p1 = fac->CreateProduct1();		//一个虚产品指向工厂创造的产品.
 Product2* p2 = fac->CreateProduct2();		//一个虚产品指向工厂创造的产品.
  • 1
  • 2
  • 3

上面两种模式都用到了虚概念, 是子类向基类退化的过程,用基类访问子类的方法。
运用了继承的概念,在子类还没有形成时,就由基类开始设计流程了。

单例模式:

限制一个类,只能有一个实例,
用法:

  Singleton* sgn = Singleton::getInstance();
  • 1

单例类实现:
单例类有一个静态类函数getInstance(), 和一个静态类成员变量_intance
当调用getInstance 时, 如果_intance 为0, 则调用new 操作符创建对象并付给_intance. 只实例化一次
构造函数为私有,外部不能用new 创建对象.

原型模式:

原型模式是说要实现一个clone 方法, 就是说要完成一个copy构造自身的过程. 以这种方法创建了一个新实例.
实例代码:

  Prototype* p = new ConcretePrototype();
  Prototype* p1 = p->Clone();
  • 1
  • 2

原型中的Clone 实现:

Prototype* ConcretePrototype::Clone() const {
  return new ConcretePrototype(*this);
}
  • 1
  • 2
  • 3

注意: copy 构造有深copy,浅copy之说, 默认浅copy, 当默认不满足要求时, 重写copy构造满足深copy要求.

建造者模式

用法举例:
对于一个产品,它的构建过程比较负责, 则我们可以用builder类把产品的构建过程封装起来.
让用户与builder 打交道, 则耦合性降低.
实例代码:

Builder *bd = new ConcretBuilder();
Product *produmt = bd->GetProduct();
  • 1
  • 2

其product 的构建过程可能如下

Product* ConcreteBuilder::GetProduct() {
  BuildPartA("pre-defined");	//步骤1, BuildPartA根据不同的builder 内容也可以不同.
  BuildPartB("pre-defined");	//步骤2
  BuildPartC("pre-defined");	//步骤3
  return new Product();		//有了前面3个步骤,才能创建产品,否则因条件不满足会创建失败.
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

c++ 语言一个难点是虚函数。
虚函数是相对于实函数而说的. 为继承而产生
虚函数存在的意义是当基类指针指向一个子类对象时,可以用基类地址访问子类的函数,
通俗讲法。 基类指针指向的虚函数,可能是未来的函数。 由未来继承者来完成。
实现方法:
每一个含有虚函数的类,创建对象时,对象都包含一个虚地址表指针(通常在offset 0 处)。
虚地址表是该类成员函数虚函数的地址列表,当子类继承父类时,若名称为重载,子类会覆盖父类条目。
所以用基类指针可以访问继承类成员函数, 是的,这种功能的实现,需要编译器的支持。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/823105
推荐阅读
相关标签
  

闽ICP备14008679号