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

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

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

工厂方法模式:

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

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

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

抽象工厂模式:

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

实例代码:

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

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

单例模式:

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

  Singleton* sgn = Singleton::getInstance();

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

原型模式:

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

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

原型中的Clone 实现:

Prototype* ConcretePrototype::Clone() const {
  return new ConcretePrototype(*this);
}

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

建造者模式

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

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

其product 的构建过程可能如下

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值