1、作用:抽象工厂的目的就是生产【产品族】,之前讲的“工厂模式”的每一个factory只造一种产品,抽象工厂让一个factory造多个产品。

uml类图:

代码实现:

抽象工厂代码:

namespace CNBlogs.DesignPattern.Common
{
/// <summary>
/// 抽象工厂类
/// </summary>
public abstract class AbstractEquipment
{
/// <summary>
/// 抽象方法: 创建一辆车
/// </summary>
/// <returns></returns>
public abstract AbstractCar CreateCar(); /// <summary>
/// 抽象方法: 创建背包
/// </summary>
/// <returns></returns>
public abstract AbstractBackpack CreateBackpack();
}
}

抽象产品代码:

namespace CNBlogs.DesignPattern.Common
{
/// <summary>
/// 抽象产品: 车抽象类
/// </summary>
public abstract class AbstractCar
{
/// <summary>
/// 车的类型属性
/// </summary>
public abstract string Type
{
get;
} /// <summary>
/// 车的颜色属性
/// </summary>
public abstract string Color
{
get;
}
} /// <summary>
/// 抽象产品: 背包抽象类
/// </summary>
public abstract class AbstractBackpack
{
/// <summary>
/// 包的类型属性
/// </summary>
public abstract string Type
{
get;
} /// <summary>
/// 包的颜色属性
/// </summary>
public abstract string Color
{
get;
}
}
}

具体工厂代码:

namespace CNBlogs.DesignPattern.Common
{
/// <summary>
/// 运动装备
/// </summary>
public class SportEquipment : AbstractEquipment
{
public override AbstractCar CreateCar()
{
return new SportCar();
} public override AbstractBackpack CreateBackpack()
{
return new SportBackpack();
}
} /// <summary>
/// 越野装备 这里就不添加了,同运动装备一个原理,demo里只演示一个,实际项目中可以按需添加
/// </summary>
//public class JeepEquipment : AbstractEquipment
//{
// public override AbstractCar CreateCar()
// {
// return new JeeptCar();
// } // public override AbstractBackpack CreateBackpack()
// {
// return new JeepBackpack();
// }
//}
}

具体产品代码:

namespace CNBlogs.DesignPattern.Common
{
/// <summary>
/// 跑车
/// </summary>
public class SportCar : AbstractCar
{
private string type = "Sport";
private string color = "Red"; /// <summary>
/// 重写基类的Type属性
/// </summary>
public override string Type
{
get
{
return type;
}
} /// <summary>
/// 重写基类的Color属性
/// </summary>
public override string Color
{
get
{
return color;
}
}
} /// <summary>
/// 运动背包
/// </summary>
public class SportBackpack : AbstractBackpack
{
private string type = "Sport";
private string color = "Red"; /// <summary>
/// 重写基类的Type属性
/// </summary>
public override string Type
{
get
{
return type;
}
} /// <summary>
/// 重写基类的Color属性
/// </summary>
public override string Color
{
get
{
return color;
}
}
}
}
//具体产品可以有很多很多, 至于越野类的具体产品这里就不列出来了。

创建装备代码:

namespace CNBlogs.DesignPattern.Common
{
public class CreateEquipment
{
private AbstractCar fanCar;
private AbstractBackpack fanBackpack;
public CreateEquipment(AbstractEquipment equipment)
{
fanCar = equipment.CreateCar();
fanBackpack = equipment.CreateBackpack();
} public void ReadyEquipment()
{
Console.WriteLine(string.Format("老范背着{0}色{1}包开着{2}色{3}车。",
fanBackpack.Color,
fanBackpack.Type,
fanCar.Color,
fanCar.Type
));
}
}
}

客户端代码:

//------------------------------------------------------------------------------
// <copyright file="Program.cs" company="CNBlogs Corporation">
// Copyright (C) 2015-2016 All Rights Reserved
// 原博文地址: http://www.cnblogs.com/toutou/
// 作 者: 请叫我头头哥
// </copyright>
//------------------------------------------------------------------------------
namespace CNBlogs.DesignPattern
{
using System;
using System.Configuration;
using System.Reflection; using CNBlogs.DesignPattern.Common; class Program
{
static void Main(string[] args)
{
// ***具体app.config配置如下*** //
//<add key="assemblyName" value="CNBlogs.DesignPattern.Common"/>
//<add key="nameSpaceName" value="CNBlogs.DesignPattern.Common"/>
//<add key="typename" value="SportEquipment"/>
// 创建一个工厂类的实例
string assemblyName = ConfigurationManager.AppSettings["assemblyName"];
string fullTypeName = string.Concat(ConfigurationManager.AppSettings["nameSpaceName"], ".", ConfigurationManager.AppSettings["typename"]);
AbstractEquipment factory = (AbstractEquipment)Assembly.Load(assemblyName).CreateInstance(fullTypeName);
CreateEquipment equipment = new CreateEquipment(factory);
equipment.ReadyEquipment();
Console.Read();
}
}
}

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. iOS 设计模式之抽象工厂

    设计模式是程序提升的必备知识,这里说下iOS怎样实现抽象工厂设计模式.本文是看过oc编程之道这本的抽象工厂这章后写出的,假设不明确原理能够看看那本书. TestView.h首先创建一个视图 // // ...

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

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

  7. PHP设计模式:抽象工厂

    示例代码详见https://github.com/52fhy/design_patterns 抽象工厂 抽象工厂(Abstract Factory)是应对产品族概念的.比如说,每个汽车公司可能要同时生 ...

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

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

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

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

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

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

随机推荐

  1. 全面解析C#中参数传递

    一.引言 对于一些初学者(包括工作几年的人在内)来说,有时候对于方法之间的参数传递的问题感觉比较困惑的,因为之前在面试的过程也经常遇到参数传递的基础面试题,这样的面试题主要考察的开发人员基础是否扎实, ...

  2. Python3 print()函数sep,end,file参数用法练习

    来自builtins.py:def print(self, *args, sep=' ', end='\n', file=None): # known special case of print &q ...

  3. github里如何删除一个repository仓库

    高手请绕行,新手往下走. 作为一个刚接触github(https://github.com/)的新手,除了感叹开源的丰富和强大之外,自己肯定也想试用一下,因此申请帐号神马的.今天自己创建一个Repos ...

  4. WCF系列教程之WCF服务宿主与WCF服务部署

    本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...

  5. java io流 数据流 DataInputStream、DataOutputStream、ByteArrayInputStream、ByteArrayOutputStream

    例子程序: package io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import ...

  6. feign中的hytrix和turbin配置

    这里我用了两个生产者和两个消费者进行演示,如下图(画的不好看,凑活看看): 这里我就只讲下怎么注册到dashbord和相关的配置,提供者和消费者等代码可以去下载查看: https://github.c ...

  7. 如何为 Go 设计一个通用的日志包

    需求 一个通用的日志包,应该满足以下几个需求: 兼容 log.Logger,标准库大量使用了 log.Logger 作为其错误内容的输出通道,比如 net/http.Server.ErrorLog,所 ...

  8. 枚举类型与Switch

    1.枚举类型,就是一个集合,集合内所有的元素都是枚举类型的, 主要是应用在可预计的集合中,(你知道它的值就只有那么几种情况,这时就可以使用枚举类型) 如: //结果一般只有两种,成功与失败 publi ...

  9. Python基础(10) - 异常

    Python 异常:程序出现了错误而在正常控制流以外采取的行为 Python中常见的异常: 1. NameError:尝试访问一个未声明的变量 >>> something Trace ...

  10. Lineare Algebra

    Grundlegendes Wort: 矩阵列:Das Spalte von der Matrix 行列式:Die Determinante 对角矩阵:Die diagonal Matrix 逆矩阵: ...