如果说 Factory和Prototype是同一个层次的话,那么Abstract Factory和Builder就是更高一级的层次。
1 Abstact Factory
在上面的Factory类型中,我们发现如果种类变了,我们还是要修改我们的代码: Factory = new 宝马工厂。 这样的代码可能出现在很多的地方,改起来并不是很方面。那么怎么办呢? 我们能不能把修改集中在一个地方?答案是可以的,那就是Abstract Factory。我们专门生成一个类来管理工厂,把 Factory = new 宝马工厂 这句话放到他的入口里面。
class AbstractFactory
{
protected:
     AbstractFactory():_instance(0){}
public:
virtual Factory* CreateCarFactory()
    {
        if(0 == _instance)
        {
             _instance = new 宝马工厂。
        }
        return _instance;
    }
private:
    Factory* _instance;
}
上面的代码实现了一个简单的singleton的Abstract Factory。这样,如果下次用户需要一个新的工厂,那么可以从这个AbstractFactory里面派生一个新的类,或者修改代码等等。
这时候,有人要问了,这种操作我们直接用Factory也可以实现阿,直接把原来 宝马工厂 的实现修改不就行了么? 当然可以,但是Abstract Factory的存在价值是 他可以支持更复杂的创建。比如一个军工厂,他生产轿车,飞机,坦克等等。其中的轿车就是我们上面说的轿车,也有很多自己的。我们就可以为军工厂实现一个自己的Abstract Factory.
class AbstractFactory
{
public:
virtual CarFactory* CreateCarFactory();
virtual TankFactory* CreateTankFactory();
virtual PlaneFactory* CreatePlaneFactory();
}
可以看出,一个Abstract Factory的价值在于它可以创建更多的工厂类。当然,他也可以创建具体的实例,prototype类,等等,甚至可以创建一个新的子AbstractFactory。 所以Abstract Factory类似一个总的管理者,管理的是各个实例的工厂。正因为如此,一个程序里面的Abstract Factory往往是singleton的。
2. builder
builder 也是一个高层建筑,但是他和Abstract Factory侧重点不同,Abstract Factory侧重于创建东西的结果,而builder侧重的是创建东西的过程。
class CarBuilder
{
public:
virtual void Setwheel();
virtual void SetMoto();
virtual void SetSeat();
virtual Car* GetCar();
}
在调用的时候采用
Car* CreateCar(CarBuilder& cb)
{
cb.SetWheel(轮子);
cb.SetMoto(马达);
cb.SetSeat(作为);
return cb.GetCar();
}
上面的例子可以看出builder的特征。

转载于:https://www.cnblogs.com/lovingprince/archive/2007/04/17/2166441.html

设计模式:Abstract Factory和Builder(比较区别,个人认为讲得很明白)相关推荐

  1. 白话设计模式——Abstract Factory

    Abstract Factory,把英文直接翻译过来的话就是"抽象工厂",既然是工厂,那就肯定是生产产品的地方.不过,它不是生产同一类的产品,而是生产同一系列的产品.举个例子,广州 ...

  2. 设计模式——Abstract Factory(抽象工厂)模式

    抽象的零件:Item类 Item类是Link和Tray类的父类,这样Link和Tray类就具有可替换性了. caption字段表示项目的"标题" makeHTML方法是抽象,需要子 ...

  3. 图解设计模式-Abstract Factory模式

    抽象工厂的工作是将"抽象零件"组装成"抽象产品". 我们不关心零件的具体实现,而是只关心接口API.我们仅适用该接口API将零件组装成为产品. 角色: Abst ...

  4. Factory Method模式的误区:Factory Method模式是简化版的Abstract Factory吗?

    FactoryMethod是一个相对比较简单的创建型模式,但是能领悟或者用对的并不多见:很多示例都没有反应出Factory Method的核心思想,只是实现了一个简化版的Abstract Factor ...

  5. Factory Method vs Abstract Factory

    点开这篇着你已经大致对工厂方法有了一定的了解.但为什么依然对这两者的区别不是很明白,在搜索了一天.看了许多文章后我有了一点想法,在这里分享并记录一下. 引用SO的一段文字: One differenc ...

  6. C++设计模式 - 建造者模式(Builder)

    对象创建模式 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fac ...

  7. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

  8. 设计模式学习笔记——抽象工厂(Abstract Factory)模式

    设计模式学习笔记--抽象工厂(Abstract Factory)模式 @(设计模式)[设计模式, 设计模式中文名, 设计模式英文名] 设计模式学习笔记抽象工厂Abstract Factory模式 基本 ...

  9. 设计模式的征途—4.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

最新文章

  1. C++关键字deprecated
  2. 在线作图|如何绘制一张好看的点棒图
  3. html5 图形化操作,HTML5的图像及动画图形操作-20210525222751.ppt-原创力文档
  4. Android之Toast---消息提示
  5. spring aop实现过程之三Spring AOP中Aspect编织的实现
  6. 从三角不等式到Margin Softmax
  7. python怎么判断是不是汉字危机_谈 Python 的中文编码处理
  8. Android中加载事件的方式
  9. java keyadapter_在java中使用keyAdapter和keyEvent时出错
  10. 动态规划应用--找零钱
  11. 【C语言基础】gdb调试工具的使用
  12. C++中Future和Promise的一种简单实现
  13. Burpsuite工具使用
  14. Gnumeric,专业处理数字软件
  15. Blog访问量提升秘笈
  16. OpenCV 人脸识别、图片相似度检测
  17. 子平格局——从旺格/从强格
  18. 厦门大学,华中科技大学 再次牵手华为
  19. 简述几种常用的编码器数据格式
  20. JQuery源码分析之—— 整体构架

热门文章

  1. Mr.J--HanioTower(递归算法)
  2. Mr.J--JavaScript-恶搞小代码
  3. poj3041 Asteroids
  4. 万恶之源 - Python基础知识补充
  5. FZU_1683 矩阵快速幂 求和
  6. [zz]很详细,涵盖了多数场景!推荐 - python 的日志logging模块学习
  7. 跨浏览器用javascript获取窗口的位置和大小
  8. Tips--利用shell脚本批量提取txt文件中任意字段
  9. PCL 学习(2)——基本数据类型与点云数据拼接
  10. Array flat