前言

    继续工厂模式高级版,抽象工厂模式。抽象工厂模式其实是从工厂方法模式拓展而来。在实际的生活中一个工厂的产品不可能是单一的,肯定是多种系列的产品。

 介绍 - 抽象工厂模式

  定义:(摘自百度百科~)为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

 实现

  继续上一篇的某淘鞋厂的例子。现在鞋厂的生意越做越大甚至还开了分厂,老板现在决定拓展业务,买衣服...夏天买T-Shirt,冬天买棉衣,下面看实现:

1.衣服

  /// <summary>
/// 衣服基类
/// </summary>
public abstract class Clothes
{
public abstract string Name { get; }
}
/// <summary>
/// T恤衫
/// </summary>
public class TShirt : Clothes
{
public override string Name
{
get
{
return "T恤衫";
}
}
}
/// <summary>
/// 夹克衫
/// </summary>
public class Jacket : Clothes
{
public override string Name
{
get
{
return "夹克衫";
}
}
}

2.鞋子

/// <summary>
/// 鞋子基类
/// </summary>
public abstract class Shoes
{
public abstract string Name { get; }
} /// <summary>
/// 凉鞋
/// </summary>
public class Sandal : Shoes
{
public override string Name
{
get
{
return "凉鞋";
}
}
}
/// <summary>
/// 棉鞋
/// </summary>
public class CottonPaddedShoes : Shoes
{
public override string Name
{
get
{
return "棉鞋";
}
}
}

3.工厂

/// <summary>
/// 抽象工厂类
/// </summary>
public abstract class Factory
{
/// <summary>
/// 生产鞋子
/// </summary>
/// <returns></returns>
public abstract Shoes CreateShoes();
/// <summary>
/// 生成衣服
/// </summary>
/// <returns></returns>
public abstract Clothes CreateClothes();
}
/// <summary>
/// 夏季工厂类
/// </summary>
public class SummerFactory : Factory
{
public override Clothes CreateClothes()
{
return new TShirt();
} public override Shoes CreateShoes()
{
return new Sandal();
}
}
/// <summary>
/// 冬季工厂类
/// </summary>
public class WinterFactory : Factory
{
public override Clothes CreateClothes()
{
return new Jacket();
} public override Shoes CreateShoes()
{
return new CottonPaddedShoes();
}
}

调用:

  class Program
{
static void Main(string[] args)
{
Console.WriteLine("夏季工厂生产...");
//夏季工厂
Factory factory = new SummerFactory();
//制造鞋子,衣服
Shoes shoes = factory.CreateShoes();
Clothes cloth = factory.CreateClothes();
//看看生产的是
Console.WriteLine("生产:{0},{1}", shoes.Name, cloth.Name); Console.WriteLine("冬季工厂生产...");
//冬季工厂
Factory factory1 = new WinterFactory();
//制造鞋子
Shoes shoes1 = factory1.CreateShoes();
Clothes cloth1 = factory1.CreateClothes();
//看看生产的是
Console.WriteLine("生产:{0},{1}", shoes1.Name, cloth1.Name);
Console.Read(); }
}

结果:

欢迎批评指正,转载请注明出处 http://www.cnblogs.com/xinwang/p/6346792.html

C# 设计模式巩固 - 抽象工厂模式的更多相关文章

  1. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  2. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  3. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  4. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  5. php设计模式之抽象工厂模式

    之前总结了一下工厂模式,其实准确地说是简单 工厂模式,在它的基础上再进行抽象就可以得到一种新的模式:抽象工厂模式. 专业一点的定义为: 抽象工厂模式(Abstact Factory)是一种常见的软件设 ...

  6. 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

  7. C#设计模式(4)-抽象工厂模式

    引言 上一篇介绍了设计模式中的简单工厂模式-C#设计模式(3)-工厂方法模式,本篇将介绍抽象工厂模式: 抽象工厂模式简介 抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依 ...

  8. C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】

    一.引言     写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了 ...

  9. Head First设计模式之抽象工厂模式

    一.定义 给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:     1)系统中有多个产品族,而系统一次只可能消费其中一族产品.      2)同属于同一个 ...

  10. 【Unity与23种设计模式】抽象工厂模式(Abstract Factory)

    GoF中定义: "提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类." 意思就是 根据不同的执行环境产生不同的抽象类子类 抽象工厂模式经常在面试中会涉及到 下面的例 ...

随机推荐

  1. 在DLL编程中,导出函数为什么需要extern "C"

    转自:http://blog.csdn.net/zhongjling/article/details/8088664 一般来讲,在DLL编程过程中,对于导出的函数前 都需要加入 extern “C”, ...

  2. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页

    Python3.x:Selenium+PhantomJS爬取带Ajax.Js的网页 前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但 ...

  3. MYSQL数据库里面的所有密码批量MD5加密

    如果你的字段够长度的话:UPDATE users SET password = MD5(password);如果长度不够,可以先增加长度后再做,或者多建一列,完成后删除原来的列!(如passwd)UP ...

  4. win10已计划自动重启怎么关

    此电脑->右击 管理->系统工具->任务计划程序->Microsoft->Windows->UpdateOrchestrator->Reboot 任务禁用

  5. LeetCode——Decode String

    Question Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string ...

  6. 无法读取服务器服务中的服务器队列性能数据。数据段的第一个四字节 (DWORD) 中包

    无法打开服务器服务性能对象.数据段的第一个四字节 (DWORD) 包含状态代码. 解决方法:修改注册表禁用PerfNet性能计数器. 具体方法:打开注册表,在HKEY_LOCAL_MACHINE\SY ...

  7. POJ 2299 Ultra-QuickSort(树状数组+离散化)

    http://poj.org/problem?id=2299 题意:给出一组数,求逆序对. 思路: 这道题可以用树状数组解决,但是在此之前,需要对数据进行一下预处理. 这道题目的数据可以大到999,9 ...

  8. POJ 3352 Road Construction(边—双连通分量)

    http://poj.org/problem?id=3352 题意: 给出一个图,求最少要加多少条边,能把该图变成边—双连通. 思路:双连通分量是没有桥的,dfs一遍,计算出每个结点的low值,如果相 ...

  9. Android -- ContentProvider, 读取和保存系统 联系人

    1. 示例代码 需要的读写联系人的权限 <uses-permission android:name="android.permission.WRITE_CONTACTS"/& ...

  10. 关于ckeditor 之 上传功能

    度了很多文章,看了很多关于ckeditor配置上传功能的文章,没一个写得清楚的, 就是简单的根目录下.config.js 增加 config.filebrowserUploadUrl="/a ...