推荐阅读:

      在工厂模式中,一个工厂只能创建一种产品,但我们往往希望,一个工厂能创建一系列产品。很明显工厂模式已经不能满足我们的需求,于是出现了抽象工厂模式。

      抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

抽象工厂模式:

1.首先是不同产品类的抽象;

2.其次是不同工厂类的抽象;

3.最后是产品不同系列的抽象;

抽象工厂模式要素:

1、抽象工厂(Creator):是工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这个接口;

2、具体工厂(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;

3、抽象产品(Product):工厂方法模式所创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;

4、具体产品(Concrete Product):这个角色实现了抽象产品角色所定义的接口。

下面举个例子来介绍一下上面几个要素之间的关系吧。

例如:命名空间抽象工厂方法模式中包含抽象工厂Factory;具体工厂MNFactory ,YLFactory;抽象产品Milk,Yogurt;具体产品YLMilk,MNMilk,YLYogurt,MNYogurt 。本案例将向大家展示如何使用简单工厂模式来进行不同的算术运算。

代码实现过程:

1.创建抽象产品:

	interface Milk//所有牛奶的父类
{
void DisPlay();//显示牛奶品牌
}
interface Yogurt//所有酸奶的父类
{
void Display();//显示酸奶品牌
}
  1. 所有的具体产品的代码(伊利牛奶,蒙牛牛奶;伊利酸奶,蒙牛酸奶)
	class YLMilk:Milk//伊利牛奶
{
public void DisPlay()
{
Console.WriteLine("我是伊利牛奶!");
}
}
class MNMilk:Milk//蒙牛牛奶
{
public void DisPlay()
{
Console.WriteLine("我是蒙牛牛奶!");
}
}
class YLYogurt:Yogurt//伊利酸奶
{
public void Display()
{
Console.WriteLine("我是伊利酸奶!");
}
}
class MNMilk:Yogurt//蒙牛酸奶
{
public void Display()
{
Console.WriteLine("我是蒙牛酸奶!");
}
}

3.抽象工厂

interface Factory//所有工厂的父类
{
Milk CreateMilk();//生产牛奶
Yogurt CreateYogurt();//生产酸奶
}

4.具体工厂(伊利工厂,蒙牛工厂)

class YLFactory:Factory//伊利工厂
{
public Milk CreateMilk()//生产伊利牛奶
{
return new YLMilk();
} public Yogurt CreateYogurt()//生产伊利酸奶
{
return new YLYogurt();
}
}
class MNFactory:Factory//蒙牛工厂
{
public MNMilk CreateMilk()//生产蒙牛牛奶
{
return new MNMilk();
} public MNYogurt CreateYogurt()//生产蒙牛酸奶
{
return new MNYogurt();
}

5.使用该工厂

namespace 抽象工厂模式
{
class Program
{
static void Main(string[] args)
{
Factory fact1 = new YLFactory(); Milk milk;
milk = fact1.CreateMilk();
milk.Display(); Yogurt yogurt;
yogurt= fact1.CreateYogurt();
yogurt.Display();
Console.ReadLine();
}
}
}

整合后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式
{
class Program
{
static void Main(string[] args)
{
Factory fact1 = new YLFactory(); Milk milk;
milk = fact1.CreateMilk();
milk.Display(); Yogurt yogurt;
yogurt= fact1.CreateYogurt();
yogurt.Display();
Console.ReadLine();
}
}
} interface Milk//所有牛奶的父类
{
void DisPlay();//显示牛奶品牌
}
interface Yogurt//所有酸奶的父类
{
void Display();//显示酸奶品牌
}
class YLMilk:Milk//伊利牛奶
{
public void DisPlay()
{
Console.WriteLine("我是伊利牛奶!");
}
}
class MNMilk:Milk//蒙牛牛奶
{
public void DisPlay()
{
Console.WriteLine("我是蒙牛牛奶!");
}
} class YLYogurt:Yogurt//伊利酸奶
{
public void Display()
{
Console.WriteLine("我是伊利酸奶!");
}
}
class MNMilk:Yogurt//蒙牛酸奶
{
public void Display()
{
Console.WriteLine("我是蒙牛酸奶!");
}
} interface Factory//所有工厂的父类
{
Milk CreateMilk();//生产牛奶
Yogurt CreateYogurt();//生产酸奶
} class YLFactory:Factory//伊利工厂
{
public Milk CreateMilk()//生产伊利牛奶
{
return new YLMilk();
} public Yogurt CreateYogurt()//生产伊利酸奶
{
return new YLYogurt();
}
}
class MNFactory:Factory//蒙牛工厂
{
public MNMilk CreateMilk()//生产蒙牛牛奶
{
return new MNMilk();
} public MNYogurt CreateYogurt()//生产蒙牛酸奶
{
return new MNYogurt();
}
}

      总之一点,在抽象工厂模式中,客户端必须针对接口编程,绝对不能针对具体的实现类编程。否则无法保证程序的扩展性和灵活性。不仅仅抽象工厂,在其他的工厂模式中也都是针对接口(抽象)编程。

      如果对于抽象工厂模式,你有更好的见解,欢迎评论区留言讨论。

设计模式(C#)——02抽象工厂模式的更多相关文章

  1. 大话设计模式C++版——抽象工厂模式

    前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...

  2. JAVA常用设计模式(一、抽象工厂模式)

    抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...

  3. 设计模式学习心得<抽象工厂模式 Abstract Factory>

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  4. C#设计模式系列:抽象工厂模式(AbstractFactory)

    出自:http://www.cnblogs.com/libingql/archive/2012/12/09/2809754.html 1. 抽象工厂模式简介 1.1 定义 抽象工厂(Abstract ...

  5. [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

    注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...

  6. IOS设计模式浅析之抽象工厂模式(Abstract Factory)

    概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...

  7. 大话设计模式Python实现- 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env pyth ...

  8. 【java设计模式】-03抽象工厂模式

    抽象工厂 简述 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.在抽象工厂模式中,接口是负责创建一个相关对象的工厂 ...

  9. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

随机推荐

  1. hdu6406 Taotao Picks Apples(线段树)

    Taotao Picks Apples 题目传送门 解题思路 建立一颗线段树,维护当前区间内的最大值maxx和可摘取的苹果数num.最大值很容易维护,主要是可摘取的苹果数怎么合并.合并左右孩子时,左孩 ...

  2. python购物车升级版

    各文件内容 前言 功能架构等请参考前一篇博客,此篇博客为进阶版的存代码展示. 详细文件内容 启动文件 starts.py启动文件 import os import sys BASE_DIR = os. ...

  3. Linux命令大全(简)

    rm--删除文件和目录   -i 删除一个已存在的文件前,提示用户进行确认.   -r 递归的删除目录. mkdir--创建目录 cp--复制文件和目录   -i 在覆盖一个已存在的目录前,提示用户进 ...

  4. 分析了京东内衣销售记录,告诉你妹子们的真Size!

    >今天闲暇之余写了一个爬虫例子.通过爬虫去爬取京东的用户评价,通过分析爬取的数据能得到很多结果,比如,哪一种颜色的胸罩最受女性欢迎,以及中国女性的平均size(仅供参考哦~) 打开开发者工具-n ...

  5. 那些年,想和你一起认识的SpringCloud Eureka

    前几天鲁班LB跟我说:你玩把游戏都要半个钟啦,为何不用这时间来看看书,如果涨工资还可以帮我买个皮肤. 面对如此合理的这需求,但我不以为然,事实上并不是我不想学习,而是 ↓ 实力不允许呀~ 直到有一天, ...

  6. 贪心算法---The best time to buy and sell store-ii

    Say you have an array for which the i th element is the price of a given stock on day i. Design an a ...

  7. 归并排序(从上到下、从下到上)——C语言

    归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归 ...

  8. Sring 的 @AliasFor 使用规则

    一.该标签存在的意义 顾名思义 @AliasFor 表示别名,它可以注解到自定义注解的两个属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义.该标签存在的含义,从网上查发现有个点, 若  自 ...

  9. hdu 6406 Taotao Picks Apples (线段树)

    Problem Description There is an apple tree in front of Taotao's house. When autumn comes, n apples o ...

  10. spark shuffle写操作三部曲之UnsafeShuffleWriter

    前言 在前两篇文章 spark shuffle的写操作之准备工作 中引出了spark shuffle的三种实现,spark shuffle写操作三部曲之BypassMergeSortShuffleWr ...