抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象。本文采取的仍然是接着以前的那个快餐店的例子。现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食习惯,创建了两大系列(相当于产品族)快餐,北方系列和南方系列。每个系列分别由一个大厨掌勺。抽象工厂模式对新的产品族支持开闭原则,但对新的产品不支持开闭原则。例如增加新的产品族,如增加美国系列快餐(相当于增加了一个产品族),则只要从每个产品接口继承一个相应美国系列产品即可,不需要更改已有的代码。但如果增加新产品,比如增加了“馒头”这个产品,则它是不支持开闭原则的,因为你要在厨师接口中,增加返回“馒头”的方法,这就要修改已存在的接口,而修改了上层接口,继承此接口的具体类也要随之改变。

使用抽象工厂模式的条件:
1 一个系统不应依赖于产品如何被创建,组合和表达的细节。
2 有多个产品族,而系统只消费其中一个族中的产品
3 同属于一个产品族的产品是在一起使用的。
4 系统提供一个产品的库,所有产品都是以同样的接口实现。

看下面的C#实现:

    /// <summary>
/// 抽象工厂模式示例
/// </summary>
class AbstractFactory
{
//定义厨师的抽象工厂
public interface Chef
{
//这里定义厨师的公共操作
//返回抽象面条
Noodle MakeNoodle();
//返回抽象米饭
Rice MakeRice();
//返回抽象面包
Bread MakeBread();
} //定义北方厨师,实现厨师接口
class NorthChef : Chef
{
public Noodle MakeNoodle()
{
Console.WriteLine("\n制作北方面条...");
Noodle noodle = new NorthNoodle();
return noodle;
}
public Rice MakeRice()
{
Console.WriteLine("\n制作北方米饭...");
Rice rice = new NorthRice();
return rice;
}
public Bread MakeBread()
{
Console.WriteLine("\n正在制作北方面包..");
Bread bread = new NorthBread(); return bread;
}
}
//定义南方厨师,实现厨师接口
class SouthChef : Chef
{
public Noodle MakeNoodle()
{
Console.WriteLine("\n正在制作南方面条。。。");
Noodle noodle = new SouthNoodle();
return noodle;
}
public Rice MakeRice()
{
Console.WriteLine("\n正在制作南方米饭。。。");
Rice rice = new SouthRice();
return rice;
}
public Bread MakeBread()
{
Console.WriteLine("\n正在制作南方面包。。。");
Bread bread = new SouthBread();
return bread;
}
} //定义面条产品
public interface Noodle
{
//这里定义面条的公共操作
}
class NorthNoodle : Noodle
{
public NorthNoodle()
{
Console.WriteLine("\n一碗地道的北方面条产生了");
}
}
class SouthNoodle : Noodle
{
public SouthNoodle()
{
Console.WriteLine("\n一碗地道的南方面条产生了");
}
}
//定义米饭产品
public interface Rice
{
//这里定义米饭的公共操作
}
class NorthRice : Rice
{
public NorthRice()
{
Console.WriteLine("\n一碗地道的北方米饭产生了,真好吃");
}
}
class SouthRice : Rice
{
public SouthRice()
{
Console.WriteLine("\n一碗地道的南方米饭产生了,真难吃");
}
}
//定义面包
public interface Bread
{
//这里可以定义一些面包的公共操作
}
class NorthBread : Bread
{
public NorthBread()
{
Console.WriteLine("\n一个地道的北方面包产生了");
}
}
class SouthBread : Bread
{
public SouthBread()
{
Console.WriteLine("\n一个地道的南方面包产生了");
}
}
}

应用程序的实现:

       /// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//针对接口编程,创建对象尽量返回上层接口,避免使用具体类
//下面隐藏了具体的创建各种面条,米饭和面包的过程
Chef northChef=new NorthChef();
northChef.MakeNoodle();
northChef.MakeRice();
northChef.MakeBread();
Chef southChef=new SouthChef();
southChef.MakeBread();
southChef.MakeNoodle();
southChef.MakeRice();
Console.ReadLine();
}

其实就这样!
抽象工厂产生实体工厂,实体工厂生产实体产品,而实体产品又属于抽象产品!
最终直接面向客户的是抽象工厂和抽象产品

简单理解C#中的抽象工厂模式是什么概念!的更多相关文章

  1. java之设计模式工厂三兄弟之抽象工厂模式

    [学习难度:★★★★☆,使用频率:★★★★★]  工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...

  2. 《JAVA与模式》之抽象工厂模式

    场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...

  3. [Python设计模式] 第15章 如何兼容各种DB——抽象工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): ...

  4. Java设计模式-抽象工厂模式(Abstarct Factory)

    抽象工厂模式 举个生活中常见的例子,组装电脑,在组装电脑时,通常需要选择一系列的配件,比如CPU,硬盘,内存,主板,电源,机箱等,为了讨论使用简单,值考虑选择CPU和主板的问题. 事实上,在选择CPU ...

  5. 《Java设计模式》之抽象工厂模式

    场景问题 举个生活中常见的样例--组装电脑.我们在组装电脑的时候.通常须要选择一系列的配件,比方CPU.硬盘.内存.主板.电源.机箱等. 为讨论使用简单点.仅仅考虑选择CPU和主板的问题. 其实,在选 ...

  6. 《JAVA设计模式》之抽象工厂模式(Abstract Factory)

    场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...

  7. .NET抽象工厂模式微理解--教你在项目中实现抽象工厂

    .NET抽象工厂模式微理解--教你在项目中实现抽象工厂 最近在学习MVC,对于MVC里面的一些项目上的东西都和抽象模式有关,今天就微说明一下个人对于抽象工厂模式的理解,以方便学习MVC及工厂模式相关的 ...

  8. 结合实例分析简单工厂模式&工厂方法模式&抽象工厂模式的区别

    之前写过一篇关于工厂模式(Factory Pattern)的随笔,里面分析了简单工厂模式,但对于工厂方法和抽象工厂的分析较为简略.这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个 ...

  9. .Net简单工厂模式,工厂模式,抽象工厂模式实例

    1.定义   简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂模式:定义一个用于创建对象的接口, ...

随机推荐

  1. PHP类库生成pdf代码实例

    require_once('./tcpdf/tcpdf.php'); //引入库文件        $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', f ...

  2. Django中的CSRF(跨站请求伪造)

    Django中的CSRF(跨站请求伪造) Django CSRF  什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...

  3. [BZOJ 5074][Lydsy1710月赛]小B的数字

    传送门 \(\color{green}{solution}\) 设 \[b_{i}=2^{w_{i}},sum= \sum_{i=1}^{n}{w_{i}}\] 则对于任意\(a_{i}\)都有 \[ ...

  4. Codeforces Round #545 (Div. 2) 题解

    题目链接 A. Sushi for Two 题意 在一个 01 序列中找出长为偶数的连续的一段使得它前一半和后一半内部分别相同,而前一半和后一半不同. \(2\le n\le 100\ 000\) 题 ...

  5. HihoCoder - 1513 bitset处理五维偏序

    题意:给出\(n<3e4\)个有序组\((a,b,c,d,e)\),求对第\(i\)个有序组有多少个\(j\)满足\((a_j<a_i,b_j<b_i,c_j<c_i,d_j& ...

  6. 【Python】批量检测百度权重

    挖洞过程中收集了站点后,我一般习惯查看站点的百度权重值,为了方便,写了一个简单的脚本, 至于结果如何显示,看个人需求吧,我这里只是简单的列一下,脚本如下: #coding:utf-8 import r ...

  7. SpringBoot 整合 ActiveMq

    消息队列,用来处理开发中的高并发问题,通过线程池.多线程高效的处理并发任务. 首先,需要下载一个ActiveMQ的管理端:我本地的版本是 activemq5.15.8,打开activemq5.15.8 ...

  8. sqoop导数

    #!/bin/bash source ExitCodeCheck.shopts=$@getparam(){ echo $opts|xargs -n1|cut -b 2-|awk -v arg=$1 - ...

  9. Python 自定义iterator生成器

    #计数版 class countdown(object): def __init__(self,start): self.start = start def __iter__(self): retur ...

  10. 我的Python升级打怪之路【四】:Python之前的一些补充

    字符串的格式化 1.百分号的方式 %[(name)][flags][width].[precision]typecode (name) 可选,用于选择指定的key flags 可选,可供选择的值有: ...