推荐阅读:

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

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

抽象工厂模式:

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. 解决Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常。

    解决Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常. 这个问题他们说是oracle的版本问题 但是好像不是...(我感觉VS版本问题,我 ...

  2. Java基础之方法

    方法 某段代码经常使用,可以使用大括号将这段代码包括起来,起个名字,以后就使用这个名字来代替这段代码. 定义格式: 修饰符 返回值类型 方法名(参数列表) { 方法体语句:   return语句: } ...

  3. LeetCode: 3 无重复字符的最长子串 (Java)

    3. 无重复字符的最长子串 https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 最初始的解 ...

  4. chapter01

    1.请用命令查出ifconfig命令程序的绝对路径[root@localhost ~]# which ifconfig 答:/usr/sbin/ifconfig 2.请用命令展示以下命令哪些是内部命令 ...

  5. Unity3D热更新之LuaFramework篇[09]--资源热更新与代码热更新的具体实现

    前言 在上一篇文章 Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建 中,我介绍了热更新的基本原理,并且着手搭建一台服务器. 本篇就做一个实战练习,真正的来实现热 ...

  6. [原创]一款基于Reactor线程模型的java网络爬虫框架

    AJSprider 概述 AJSprider是笔者基于Reactor线程模式+Jsoup+HttpClient封装的一款轻量级java多线程网络爬虫框架,简单上手,小白也能玩爬虫, 使用本框架,只需要 ...

  7. js里的window对象

    alert(<msg>)                   向用户显示对话框窗口并等候其被关闭 blur()                               让窗口失去键盘焦 ...

  8. JS中构造函数和普通函数有什么区别

    JS中构造函数有普通函数有什么区别? 1.一般规则 构造函数都应该以 一个大写字母开头,eg: function Person(){...} 而非构造函数则应该以一个小写字母开头,eg: functi ...

  9. 用scrapy爬取搜狗Lofter图片

    用scrapy爬取搜狗Lofter图片 # -*- coding: utf-8 -*- import json import scrapy from scrapy.http import Reques ...

  10. k8s学习02-----kubeadm部署k8s

    机器规划 系统配置 三台机器都执行 1.关闭selinux及firewalld sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux ...