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. Sublime Text 3插件收集

    0.Package Control 这个是必须装的,就不多解释了 1.ConvertToUTF8 支持 GBK, BIG5, EUC-KR, EUC-JP, Shift_JIS 等编码的插件. 2.B ...

  2. springboot入门神器 -http://start.spring.io/(在线项目构建)

    参考并直接引用:http://www.sousou.io/article/1506656459859 最近在学习spring boot,看的书是<JavaEE开发的颠覆者 Spring Boot ...

  3. 装B 自卫神器 -

    IE内核下,使用XX插件 修改网页源代码直接无缝显示数据. 包括https FF同样. 截图: 可以修改所有客户端数据,用以迷惑他们.纯属娱乐 ``````` 再次,顺便提醒下. 做网赚的很多朋友,切 ...

  4. Tomcat的配置文件Server.xml解析

    配置元素说明: 元素名 属性 解释 server port 指定一个端口,这个端口负责监听关闭tomcat 的请求 shutdown 指定向端口发送的命令字符串 service name 指定serv ...

  5. 饶军:Apache Kafka的过去,现在,和未来

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文首发在云+社区,未经许可,不得转载. 大家好,我大概简单的介绍一下,我叫饶军,我是硅谷的初创公司Confluent的联合创始人之一,我们公 ...

  6. 《Think Python》第17章学习笔记

    目录 <Think Python>第17章学习笔记 17.1 面向对象的特性(Object-oriented features) 17.2 打印对象(Printing objects) 1 ...

  7. 使用Redis SETNX 命令实现分布式锁(转载)

    使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其实现方法. SETNX命令简介 命令格式 SETNX key value 将 key 的值设为 value,当且仅当 key 不存在. 若 ...

  8. 前端工程师的mysql笔记

    背景 最近常参与后台php项目,虽说刚毕业时自学过一阵子php和mysql,不过长时间没用也忘差不多了,于是把mysql再温习一遍,前端同学也可以一起学习下! mysql安装以及操作 安装 brew ...

  9. 类class思维导图

  10. golang操作mysql数据库

    golang操作mysql数据库 代码: mysql的增.删.改.查 package main import ( "database/sql" "fmt" &q ...