动机:实现一系列相互依赖对象的创建,通过封装系列对象创建来隔离对象创建和客户程序,从而能够灵活提供更多系列对象创建和系列对象间的切换,而不需要改变客户程序。

应用:多种风格软件界面控件的创建、对应多种数据库的多系列数据访问层对象的创建(比如Petshop中的数据访问层对象)。

场景:此处以ThinkPad系列产品的组装为例子。组装电脑程序(即客户)需要根据需要拿出不同系列ThinkPad(此处以T43和T60为例)部件(以CPU和主板为例)组装成ThinkPad。因为T43和T60的CPU系列接口不同,所以同一系列中的CPU和主板相互依赖,每次只能拿同一系列的CPU和主板进行组装。

Factory Method模式:Factory Method模式是Abstract Factory模式的特殊形式,它实现一个对象的创建,而Abstract Factory模式实现系列对象创建。如这里只涉及到多种CPU的创建,则变为了Factory Method模式。

结构

代码实现

/**//*
* 产品CPU
*/
namespace DesignPattern.AbstractFactory
{
    public abstract class CPU
    {
    }

    public class T43CPU : CPU
    {
    }

    public class T60CPU : CPU
    {
    }
}
/**//*
* 产品主板
*/
namespace DesignPattern.AbstractFactory
{
    public abstract class Mainboard
    {
    }

    public class T43Mainboard : Mainboard
    {
    }

    public class T60Mainboard : Mainboard
    {
    }
}
/**//*
 * 不同ThinkPad系列相互依赖部件组成不同型号ThinkPad,此处忽略各种不同型号。
*/
namespace DesignPattern.AbstractFactory
{
    public class ThinkPad
    {
        public void Play()
        {
        }
    }
}
/**//*
 * ThinkPad工厂,生产各型号ThinkPad部件
*/
namespace DesignPattern.AbstractFactory
{
    public abstract class ThinkPadFactory
    {
        public abstract CPU CreateCPU();
        public abstract Mainboard CreateMainboard();
    }

    public class T43Factory : ThinkPadFactory
    {
        public override CPU CreateCPU()
        {
            return new T43CPU();
        }

        public override Mainboard CreateMainboard()
        {
            return new T43Mainboard();
        }
    }

    public class T60Factory : ThinkPadFactory
    {
        public override CPU CreateCPU()
        {
            return new T60CPU();
        }

        public override Mainboard CreateMainboard()
        {
            return new T60Mainboard();
        }
    }
}
/**//*
* 客户程序,从ThinkPad工厂中拿出所需系列部件进行组装。
*/
namespace DesignPattern.AbstractFactory
{
    public class ThinkPadAssembly
    {
        public static readonly ThinkPadAssembly Instanse = new ThinkPadAssembly();

        public ThinkPad CreateThinkPad(string strThinkPadName)
        {
            ThinkPadFactory thinkPadFactory = (ThinkPadFactory)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance("DesignPattern.AbstractFactory" + "." + strThinkPadName + "Factory");
            CPU cpu = thinkPadFactory.CreateCPU();
            Mainboard mainboard = thinkPadFactory.CreateMainboard();

            return Assemble(cpu, mainboard);
        }

        private ThinkPad Assemble(CPU cpu, Mainboard mainboard)
        {
            // 组装并返回ThinkPad,此处简化各种型号的ThinkPad
            return new ThinkPad();
        }
    }
}

转载于:https://www.cnblogs.com/Charly/archive/2007/05/29/763697.html

设计模式学习笔记三——Abstract Factory模式相关推荐

  1. 设计模式学习笔记——享元(Flyweight)模式

    设计模式学习笔记--享元(Flyweight)模式 @(设计模式)[设计模式, 享元模式, flyweight] 设计模式学习笔记享元Flyweight模式 基本介绍 享元案例 类图 实现代码 Big ...

  2. 设计模式学习笔记——中介者(Mediator)模式

    设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...

  3. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  4. 设计模式学习笔记--享元(Flyweight)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...

  5. 设计模式学习笔记--Mediator 中介者模式

    我们知道面向对象应用程序是由一组为了提供某种服务而彼此交互的对象组成.当彼此引用的对象数量比较少时,此时对象之间就为直接交互(点对点).而当对象的数量增加时,这种直接交互会导致对象之间复杂的.混乱的引 ...

  6. 设计模式学习笔记--Flyweight享元模式

    Flyweight模式也叫享元模式,是由GoF提出的23种设计模式中的一种.Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用,所以叫享元.   此模式解决的是由于大量 ...

  7. C#设计模式学习笔记:(4)建造者模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7614630.html,记录一下学习过程以备后续查用.一.引言在现实生活中,我们经常会遇到一些构成比较复杂的物 ...

  8. 设计模式学习笔记(八)—Template Method模式

    factory模式(包括简单工厂和抽象工厂),Strategy模式,Template method模式是学习Spring框架必不可少的. <设计模式>一书对Template Method模 ...

  9. 步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)

    策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern defines a fami ...

最新文章

  1. 如何知道刚刚插入数据库那条数据的id
  2. 【运筹学】线性规划数学模型 ( 知识点回顾 | 可行解 | 最优解 | 阶梯型矩阵 | 阶梯型矩阵向量 | 基 | 基向量 | 基变量 | 非基变量 )
  3. GitHub/Git 使用
  4. 困了。还得背课文。变词型
  5. JAVA maven Spring 开发 webservice 步骤
  6. 经典排序算法 - 耐心排序Patience Sorting
  7. Java中的Arrays类使用详解
  8. [LeetCode] Best Time to Buy and Sell Stock
  9. Delphi XE7 下载 安装序列号 破解
  10. .\Objects\TIM_TEST.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
  11. chrome 扩展插件API
  12. 纯手工html+css实现静态游戏网首页(免费拿源码)
  13. 如何向中级程序员转变
  14. mysql dump 1449_mysqldump 1449错误解决办法
  15. JavaScript边学边玩的小游戏、好用的js网站:
  16. flutter 复制粘贴默认英文显示问题
  17. 小程序获取用户信息(微信运动步数)
  18. wish中国_如何设计成功的电子商务应用程序:从Wish中学到的UX经验教训
  19. Microsoft edge初始页面设置
  20. 企业大数据在平安科技信用风险管理的应用实践

热门文章

  1. C 盘FAT32变为 RAW 格式
  2. caffe 练习1:training LeNet on MNIST with Caffe/ 用LeNet识别手写字符集 Mnist------by 香蕉麦乐迪
  3. 在线实时大数据平台Storm并行和通信机制理解
  4. (转载)大数据实战:站在JMP分析平台上的FIT足迹识别技术
  5. 数据结构源码笔记(C语言):统计字符串中出现的字符及其次数
  6. 语法转换_语法 | 句型转换之肯定句变否定句
  7. 如何加快HTML页面加载速度
  8. 观察多个线程同时运行|| 查看进程线程的方法——未完待续
  9. 【HDU2582 关于 gcd( C[n][1],C[n][2],C[n][3],........C[n][n-1) 】
  10. Python3 Urllib学习