AbstractFactory抽象工厂模式(创建型)

作用:

这种模式支持创建不同的对象,这些对象功能接近且一般都是在一起创建的。抽象工厂被具体化成不同的工厂来创建类似产品的不同产品。这种模式将类于使用的客户端分离以便通过工厂来创建。这样,各类产品可以方便的变化而不需要改变使用者的结构。

Role
This pattern supports the creation of products that exist in families and are designed to be produced together. The abstract factory can be refined to concrete factories,each of which can create different products of different types and in different combinations. The pattern isolates the product definitions and their class names from the client so that the only way to get one of them is through a factory. For this reason, product families can easily be interchanged or updated without upsetting the structure of the client.

设计:

抽象工厂接口IAbstractFactory,含有创建各类抽象产品abstract products的操作;

工厂1Factory1, 工厂2Factory2,实现了抽象工厂接口IAbstractFactory的创建产品的操作;

抽象产品接口IProductA,IProductB,含有某类产品自有的操作;

具体产品ProductA1, ProductA2, ProductB1, ProductB2,实现了抽象产品接口的具体产品类,这些具体产品类由相应的工厂生产;

举例:

AbstractFactory     生产一种钢笔
FactoryA               英雄钢笔厂
FactoryB               永生钢笔厂
AbstractProduct     钢笔产品
ProductA1             英雄金笔
ProductB1             永生金笔

ProductA2             英雄软笔
ProductB2             永生软笔
代码:

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AbstractFactory
{
    //抽象工厂
    abstract class AbstractFactory
    {
        abstract public AbstractWheel CreatWheel();
        abstract public AbstractOilBox CreatOilBox();
    }

abstract class AbstractWheel
    {
        public AbstractWheel()
        {
            //Console.Write("Create a AbstractProduct");
        }
    }

abstract class AbstractOilBox
    {
        public AbstractOilBox()
        { }
    }

class BMWFactory : AbstractFactory
    {
        public override AbstractWheel CreatWheel()
        {
            return new BMWWheel();
        }

public override AbstractOilBox CreatOilBox()
        {
            return new BMWOilBox();
        }
    }

class BMWWheel : AbstractWheel
    {
        public BMWWheel()
        {
            Console.WriteLine("Create a BMWwheel");
        }
    }

class BMWOilBox : AbstractOilBox
    {
        public BMWOilBox()
        {
            Console.WriteLine("Create a BMWOilBox");
        }
    }

class BORAWheel:AbstractWheel
     {
      public BORAWheel()
      {
       Console.Write("Create a BORAWheel");
      }
     }

class BORAOilBox:AbstractOilBox
     {
      public BORAOilBox()
      {
       Console.Write("Create a BORAOilBox");
      }
     }
         
     class BORAFactory:AbstractFactory
     {
      public override AbstractWheel CreatWheel()
      {
       return new BORAWheel();
      }

public override AbstractOilBox CreatOilBox()
      {
       return new BORAOilBox();
      }

}

class Program
    {
        static void Main(string[] args)
        {
            AbstractFactory factory = null;
            factory = new BORAFactory();
            factory.CreatWheel();
            factory.CreatOilBox();
            Console.ReadLine();

factory = new BMWFactory();
            factory.CreatWheel();
            factory.CreatOilBox();
            Console.ReadLine();
        }
    }
}

 使用场景:

1、系统不依赖他要使用对象的创建、组成、表示
2、系统需要配置使用多组对象
3、创建对象和工厂必须是强制使用的
4、重点是要暴露接口而不是实现

Use the Abstract Factory pattern when…
•  A system should be independent of how its products are created, composed, and represented.
•  A system can be configured with one of multiple families of products.
•  The constraint requiring products from the same factory to be used together must be enforced.
•  The emphasis is on revealing interfaces, not implementations.

总结:

抽象工厂模式是一种创建型模式,目的是解决实例化对象时所带来的问题。在现实中系统总是需要变化来实例化不同的对象,因此封装“创建操作”到抽象工厂,由具体的工厂来实例相应的对象。抽象工厂模式面向接口,将实例化对象的操作封装起来,不同的工厂都实现实例对象的操作。
      在系统中,经常会遇到“一组相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。面对这种问题,避免使用常规的对象创建方法,使用“封装实例华对象”来避免系统和这种“多系列具体对象创建工作”的紧耦合。
      在需求稳定。系统基本无变化的情况下松耦合和紧耦合是没有区别的,但是需求的变化,要求在某些方面将系统"解耦",抽象工厂就是将对象的实例化和系统解耦。
     《设计模式》:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们的具体类。Abstract Factory模式的几个要点:
     1、如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式。
     2、“系列对象”指的是这项对象之间有相互依赖、或作用的关系。
     3、Abstract Factory模式主要在于应对“新系列”的需求变动。缺点是难以应对“新对象”的需求变动。这一点应该注意,就像前面说的,如果我们现在要在加入其他系列的类,代码的改动会很大。
     4、Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。

转载于:https://www.cnblogs.com/utopia/archive/2010/02/28/1675216.html

设计模式学习总结1 - 创建型1 - Abstract Factory抽象工厂模式相关推荐

  1. 笔记:设计模式(3)-Abstract Factory抽象工厂模式

      工厂模式的起源 1.变化点在"对象的创建",因此就封装"对象创建": 2.面向接口编程,依赖接口,而非依赖实现. 动机(Motivation) 在系统中,经 ...

  2. Java 设计模式之 Abstract Factory 抽象工厂模式

    在工厂方法基础上,将工厂的生产方法的返回类型从具体产品抽象为抽象产品,同时扩展工厂的方法,支持任意定制产品族,则工厂方法可以升级为抽象工厂模式,比如一家餐厅可以提供牛排(方法A),红酒(方法B),蔬菜 ...

  3. Abstract Factory抽象工厂模式

    抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...

  4. Java设计模式学习1:创建型与结构型

    设计模式介绍 首先要明白设计模式到底是什么,设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four (GoF) 的分类了,他们将设计模式分类为 23 种 ...

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

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

  6. 【设计模式】之抽象工厂模式

    创造性设计模式 创造型模式主要是为了实例化类所用.进一步又分为类创建.对象创建模式. 类创建模式 类创建模式主要基于继承方式进行实例化 对象创建模式 对象创建模式主要基于委托机制进行实例化 Abstr ...

  7. 【Java设计模式 设计模式与范式】创建型模式 四:抽象工厂模式

    本篇Blog继续学习创建型模式,创建型模式的主要关注点是怎样创建对象,它的主要特点是将对象的创建与使用分离,这样可以降低系统的耦合度,使用者不需要关注对象的创建细节.本篇学习的是抽象工厂模式.由于学习 ...

  8. 设计模式速查手册-创建型

    Is & Is Not 这篇文章是-- 仅包含模式的名称.简要说明.结构类图和结构示例代码. 可用于快速浏览.回顾.查询及复习设计模式. 模式的意图和使用场合来自作者的个人实践总结. 虽然示例 ...

  9. 《设计模式》读书笔记——创建型模式

    设计模式 创建模式 定义: 创建型模式抽象了实例化过程.他们帮助一个系统独立于如何创建.组合和表示它的那些对象 一个类创建型模式使用继承改变被实例化的类,而一个对象创建模式是将实例化委托给另一个对象 ...

最新文章

  1. 如何让java代码保存一天内的记录_Java的JVM解读
  2. Eclipse debug Source not found
  3. [Python人工智能] 三十四.Bert模型 (3)keras-bert库构建Bert模型实现微博情感分析
  4. html中链接不自动变色,HTML 点击 标签 链接 点击之后变色-转发【已解决】
  5. Mac上重装pycharm打不开的解决方法
  6. Chrome 清除当前网站下的缓存
  7. swagger-ui多端口自动切换优化
  8. 小规模45万免税,免的是增值税,没有企业所得税!
  9. 基于深度学习安卓端烟雾和火焰检测开发总结
  10. Unity学习笔记--无限地图(地图拼接)
  11. 心中有佛,看谁都是佛;心中有屎,看谁都是屎。
  12. 511遇见易语言文本处理寻找文本
  13. rtbeginreg.html文件,【答疑】安装3DMAX2014版本出现“Autodesk Licensing”的小窗口 - 视频教程线上学...
  14. android studio 免费实现聊天视频功能
  15. 清华大学尹成 怎么样
  16. 湖南中职计算机考试练习题
  17. 有关urlrewrite
  18. 连接数据库失败提示hba.conf不符合的处理方法
  19. 美国iPS细胞治疗癌症最新进展
  20. i5 10400f参数 i5 10400f可以超频吗

热门文章

  1. java spark环境配置文件_JAVA, SCALA, HADOOP, SPARK里的JAVA_HOME和环境变量设置
  2. wxpython使用方法_python图形界面开发之wxPython树控件使用方法详解
  3. 读《系统虚拟化-原理与实现》-第二章
  4. php网址变量怎么输出,【PHP网站】如何使用dedecms v5.7前台模版里输出变量
  5. 等压线上怎么画风向_战场上骑兵应该怎么拔刀?从清人佩刀为何总是刀柄向后说起...
  6. c++ java通信 protocol buffer,google protocol buffer (C++,Java序列化应用实例)
  7. 利用rfcomm实现树莓派与手机通信_工业物联网 | 怎么用NodeRed实现树莓派与阿里云物联网平台通信?虹科告诉你!...
  8. 一个html有几个css,几个CSS的黑科技_html/css_WEB-ITnose
  9. Oracle取最大/最小值函数
  10. matplotlib可视化_EDA:Geopandas,Matplotlib和Bokeh中的可视化