相比于工厂模式,抽象工厂模式的每个工厂可以创建产品系列,而不是一个产品;

抽象工厂用到的技术:接口、多态、配置文件、反射;

抽象工厂模式的设计原则:

  • 实现客户端创建产品和使用产品的分离,客户端无须了解创建的细节,符合迪米特法则;
  • 客户端面向接口定义产品,符合依赖倒置原则;
  • 客户端面向接口定义工厂,而实际根据配置文件生成工厂实现类,符合里氏替换原则;
  • 增加新的产品族时,无须修改原有代码,符合开闭原则;
  • 使用配置文件,而不是硬编码方式指定创建的具体工厂,符合迪米特法则;
  • 相较于简单工厂模式,抽象工厂中,一个工厂只负责某一产品系列的创建,而不是所有产品的创建,符合单一职责原则;

类图 with SartUML

工厂接口和两个实现类

    internal interface SkinFactory
{
Button CreateButton();
TextField CreateTextField();
ComboBox CreateComboBox();
}
    internal class SpringSkinFactory : SkinFactory
{
public Button CreateButton()
{
return new SpringButton();
} public ComboBox CreateComboBox()
{
return new SpringComboBox();
} public TextField CreateTextField()
{
return new SpringTextField();
}
}
    internal class SummerSkinFactory : SkinFactory
{
public Button CreateButton()
{
return new SummerButton();
} public ComboBox CreateComboBox()
{
return new SummerComboBox();
} public TextField CreateTextField()
{
return new SummerTextField();
}
}

Button产品接口和两个实现类

    internal interface Button
{
void Display();
}
    internal class SpringButton : Button
{
public void Display()
{
Console.WriteLine("绿色按钮");
}
}
    internal class SummerButton : Button
{
public void Display()
{
Console.WriteLine("蓝色按钮");
}
}

TextField产品的接口和两个实现类

    internal interface TextField
{
void Display();
}
    internal class SpringTextField : TextField
{
public void Display()
{
Console.WriteLine("绿色文本框");
}
}
    internal class SummerTextField : TextField
{
public void Display()
{
Console.WriteLine("蓝色文本框");
}
}

ComboBox产品的接口和两个实现类

    internal interface ComboBox
{
void Display();
}
    internal class SpringComboBox : ComboBox
{
public void Display()
{
Console.WriteLine("绿色组合框");
}
}
    internal class SummerComboBox : ComboBox
{
public void Display()
{
Console.WriteLine("蓝色组合框");
}
}

配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="factoryType" value="AbstractFactoryPattern.SpringSkinFactory"/>
</appSettings>
</configuration>

客户端

    internal class Program
{
static void Main(string[] args)
{
//面向接口定义,使用多态,便于扩展
SkinFactory factory;
Button button;
TextField textField;
ComboBox comboBox;
//读取配置文件
string factoryType = ConfigurationManager.AppSettings["factoryType"];
//反射创建工厂对象
factory = Assembly.Load("AbstractFactoryPattern").CreateInstance(factoryType)as SkinFactory;
//工厂创建UI对象
button = factory.CreateButton();
textField = factory.CreateTextField();
comboBox = factory.CreateComboBox();
button.Display();
textField.Display();
comboBox.Display();
Console.Read();
}
}

运行结果:

设计模式之:抽象工厂模式AbstractFactoryPattern的实现的更多相关文章

  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. 设计模式——抽象工厂模式(AbstractFactoryPattern)

    抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. UML图: IFactory: package com.cnblog.clarck ...

  5. GoLang设计模式3 - 抽象工厂模式

    之前我们介绍了工厂设计模式,现在我们再看一下抽象工厂设计模式.抽象工程模式顾名思义就是对工厂模式的一层抽象,也是创建型模式的一种,通常用来创建一组存在相关性的对象. UML类图大致如下: 类图比较复杂 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 安卓手机APP兼容性测试如何有效进行?

    Android App兼容性测试是一个比较重要的App评价内容,实际上兼容性测试不仅仅和测试人员相关,在开发阶段就应当着重考虑,因为兼容性问题是除了实现App本身要求的功能后,必须要关注.而且至关重要 ...

  2. 『德不孤』Pytest框架 — 10、setUp()和tearDown()函数

    目录 1.setUp()和tearDown()函数介绍 2.setUp()和tearDown()函数作用 3.setUp()和tearDown()函数说明 4.示例 (1)方法级 (2)类级 (3)函 ...

  3. laravel7 数据迁移及填充数据

    1:置迁移数据表,创建生成模型和迁移文件: php artisan make:model Article -m 2:接着,在框架中的database/migrations文件夹中找到刚创建的用户表Ar ...

  4. PhpStrom 好用的代码小地图插件

    类似SublimeText的Mini Map插件 ,废话不多直接上 安装 打开File -> Settings -> Plugins -> 搜索CodeGlance -> in ...

  5. (转载)字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8

  6. Netty学习(三)高性能之ByteBuf源码解析

    原文链接: https://juejin.im/post/5db8ea506fb9a02061399ab3 Netty 的 ByteBuf 类型 Pooled(池化).Unpooled(非池化) Di ...

  7. Semantic Text Similarity

    stop word是指像the,is ,are等等方向的词 stemming意思就是将形式化为一样的形式,比如lists,listed,list都可以化为list形式.

  8. .NET6: 开发基于WPF的摩登三维工业软件 (10) - 机器人

    基于前文介绍的Ribbon界面.插件化.MVVM模式等内容,我们搭建了一个软件雏形.本文将综合之前的内容在RapidCAX框架中集成Robot组件,实现一个简单的机器人正向模拟模块. 1 目标 基于M ...

  9. python 装饰器的使用

    装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权 ...

  10. Java工具之Myeclipse程序调试

    步骤1: 分析错误,设置断点 步骤2: 启动调试 步骤3: 单步运行 (1)调试启动后,运行到设置断点的代码行将停住 (2)点击F6键可以单步运行程序,观察程序运行过程. (3)使用F5进入方法中进行 ...