介绍了简单工厂与工厂方法之后,现在我们来看一下工厂三兄弟的最后一个 —— 抽象工厂。

那什么是抽象工厂呢?

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象

的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

说起来,抽象工厂与工厂方法类似,但与工厂不同的是抽象工厂不再提供一个单一的抽象产品创建。而是提供了同一产品族不同产品等级结构的创建方式。

这里解释一下两个名词:

  • 产品等级结构

    在之前的工厂方法当中,一个工厂只能创建一个产品,这个产品可能会有多层继承产品。

    比如说有一个抽象产品电视机,那么可能是苹果手机这一个抽象产品,但是苹果手机有

    多个版本,可能会有 IPHONE5s,IPHONE6,IPHONE7,IPHONE7PLUGS。所以产品结构就

    是一个产品的继承结构,比如我们之前的工厂方法只能生成苹果手机而已。
  • 产品族

    产品族指代的就是由同一个工厂生产的,但是位于不同产品结构中的一组产品。还是

    举个例子,苹果公司不可能生产苹果手机,当然他还有苹果电脑,苹果手表等。所以,一

    个工厂就是一个产品族。

So,在这里说白了我们就是在之前的工厂方法当中进行了一个扩展,使得抽象工厂类不再产生单一的产品结构,而是可以生产多个不同的产品结构,而实现工厂就是不同的产品族。

抽象工厂实现了开闭原则,即要求系统对扩展开放,对修改封闭,通过扩展达到增强其功能的目的。

在这里增加产品族很方便,只需要增加一个工厂即可,对已有的代码无需任何修改。

但是增加产品结构,必须修改抽象工厂类,然后所有实现类都需要更改,不能很好的支持“开闭原则”。

接下来就上代码:

// 电脑产品
public abstract class Computer
{
public abstract void Run();
}
// 手机产品
public abstract class Phone
{
public abstract void Run();
}
public class AppleComputer : Computer
{
public override void Run()
{
Console.WriteLine("苹果电脑");
}
}
public class ApplePhone : Phone
{
public override void Run()
{
Console.WriteLine("苹果手机");
}
}
public class MicrosoftComputer : Computer
{
public override void Run()
{
Console.WriteLine("微软电脑");
}
}
public class MicrosoftPhone : Phone
{
public override void Run()
{
Console.WriteLine("微软手机");
}
}
// 抽象工厂
public abstract class AbsFactory
{
public abstract Computer BuildComputer();
public abstract Phone BuildPhone();
}
// 苹果工厂
public class AppleFactory : AbsFactory
{
public override Computer BuildComputer()
{
return new AppleComputer();
}
public override Phone BuildPhone()
{
return new ApplePhone();
}
}
// 微软工厂
public class MicrosoftFactory : AbsFactory
{
public override Computer BuildComputer()
{
return new MicrosoftComputer();
}
public override Phone BuildPhone()
{
return new MicrosoftPhone();
}
}
public static Program
{
static Main()
{
var microsoftFactory = new MicrosoftFactory();
Computer microsoftComputer = microsoftFactory.BuildComputer();
Phone microsoftPhone = micorosoftFactory.BuildPhone();
var appleFactory = new AppleFactory();
Computer appleComputer = appleFactory.BuildComputer();
Phone applePhone = appleFactory.BuildPhone();
microsoftComputer.Run();
microsoftPhone.Run();
appleCompurer.Run();
applePhone.Run();
}
}

抽象工厂是工厂方法的进一步扩展,抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。

他们三兄弟之间并没有太大的差别。抽象工厂如果只构建一个产品等级结构的话那么他就退化成为工厂方法,当然工厂方法也可以退化为简单工厂。

抽象工厂模式适用于:

  1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节;
  2. 系统中有多于一个的产品族,而每次只使用其中某一产品族;
  3. 属于同一个产品族的产品将在一起使用;
  4. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

[C#]设计模式-抽象工厂-创建型模式的更多相关文章

  1. [C#]设计模式-简单工厂-创建型模式

    在设计模式当中有三大工厂,分别是 简单工厂.抽象工厂.工厂方法 这三种创建实例的设计模式,这里先从简单工厂将其,从名字就可以看出这是这三种工厂模式当中最为简单的一种实现. 简单工厂一般由以下几个对象组 ...

  2. C#面向对象设计模式纵横谈——3.Abstract Factory 抽象工厂(创建型模式)

    动机(Motivation) 在软件系统中经常面临着“一系列相互依赖的对象”的创建工作,同时,由于需求变化,往往存在更多系列对象的创建工作.如何应对这种变化?如何绕过常规对象的创建,提供一种“封装机制 ...

  3. Java经典设计模式之五大创建型模式

    转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...

  4. .NET设计模式 第二部分 创建型模式(2)—抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory) ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变 ...

  5. 初探Java设计模式1:创建型模式(工厂,单例等)

    Java 设计模式 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简 ...

  6. Java经典设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  7. NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)

    创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统 ...

  8. Java设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  9. C++ 设计模式 2:创建型模式

    0 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活. 1 简单工厂模式 简单 ...

随机推荐

  1. Algorithm --> n位数去掉k位后找最小数

    去掉K位求取最小数 一个n位的数,去掉其中的k位,怎样使留下来的(n-k)位数按原来的前后顺序组成的数最小 例如 8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123 ...

  2. 套接字API

    Q:套接字特点 A:管道,消息队列,信号量,共享内存这些通信机制只能允许同一计算机上运行的进程相互通信,而套接字不仅可以提供在同一计算机上的进程间通信,还可以提供不同计算机上的进程间通信. 服务器端: ...

  3. Android游戏开发之旅 View类详解

    Android游戏开发之旅 View类详解 自定义 View的常用方法: onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) ...

  4. python PIL模块学习

    PIL PIL:Python Imaging Library.对于图像识别,大量的工作在于图像的处理,处理效果好,那么才能很好地识别,因此,良好的图像处理是识别的基础. PIL安装 安装推荐别人的吧, ...

  5. node.js应用脚手架:koa2、sequelize、mysql

    自制了一个 nodejs 应用的脚手架. 基于 koa2 的,所以需要保证 node 环境至少为 7.6.0 吸取了以前的踩坑教训,添加了守护进程,确保应用不会因为异常导致网站直接挂掉(使用了 for ...

  6. Git详细教程(2)---多人协作开发

    Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...

  7. JavaScript(第一天)【<script>标签浅析】

    一.创建一张HTML页面 初学者创建一张html页面建议借助工具,例如Dreamweaver可视化编辑器.   二.<Script>标签解析 <script>xxx</s ...

  8. 安装iis8

    -------------------- @echo off     echo 正在添加IIS8.0 功能,依据不同的网络速率,全程大约需要5分钟时间...     start /w pkgmgr / ...

  9. 项目Alpha冲刺Day3

    一.会议照片 二.项目进展 1.今日安排 服务器后台基本搭建完成,完成帐号权限一小部分完成并进行框架使用练手. 2.问题困难 跨专业成员不熟java的开发,有一名成员之前主要做安卓的,所以有比较多的东 ...

  10. 201621123031 《Java程序设计》第5周学习总结

    作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:接口.继承.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需 ...