设计模式之:抽象工厂模式AbstractFactoryPattern的实现
相比于工厂模式,抽象工厂模式的每个工厂可以创建产品系列,而不是一个产品;
抽象工厂用到的技术:接口、多态、配置文件、反射;
抽象工厂模式的设计原则:
- 实现客户端创建产品和使用产品的分离,客户端无须了解创建的细节,符合迪米特法则;
- 客户端面向接口定义产品,符合依赖倒置原则;
- 客户端面向接口定义工厂,而实际根据配置文件生成工厂实现类,符合里氏替换原则;
- 增加新的产品族时,无须修改原有代码,符合开闭原则;
- 使用配置文件,而不是硬编码方式指定创建的具体工厂,符合迪米特法则;
- 相较于简单工厂模式,抽象工厂中,一个工厂只负责某一产品系列的创建,而不是所有产品的创建,符合单一职责原则;
类图 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的实现的更多相关文章
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- 设计模式——抽象工厂模式(AbstractFactoryPattern)
抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. UML图: IFactory: package com.cnblog.clarck ...
- GoLang设计模式3 - 抽象工厂模式
之前我们介绍了工厂设计模式,现在我们再看一下抽象工厂设计模式.抽象工程模式顾名思义就是对工厂模式的一层抽象,也是创建型模式的一种,通常用来创建一组存在相关性的对象. UML类图大致如下: 类图比较复杂 ...
- java设计模式之抽象工厂模式
上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...
- php设计模式之抽象工厂模式
之前总结了一下工厂模式,其实准确地说是简单 工厂模式,在它的基础上再进行抽象就可以得到一种新的模式:抽象工厂模式. 专业一点的定义为: 抽象工厂模式(Abstact Factory)是一种常见的软件设 ...
- 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- C#设计模式(4)-抽象工厂模式
引言 上一篇介绍了设计模式中的简单工厂模式-C#设计模式(3)-工厂方法模式,本篇将介绍抽象工厂模式: 抽象工厂模式简介 抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依 ...
随机推荐
- 研发管理平台DevOps使用流程
研发管理平台DevOps使用流程:一.注册开发者账号二.登录平台三.点击:我的项目-内部项目三.点击"发布内部项目",创建项目五.进入项目六.研发管理平台研发管理平台的功能包括:可 ...
- 十进制数转IEE754单精度浮点数以及浮点数转换的python实现
十进制数转IEE754单精度浮点数 理解题目 单精度浮点数:单精度浮点数是用来表示带有小数部分的实数,一般用于科学计算.占用4个字节(32位)存储空间,包括符号位1位,阶码8位,尾数23位.其数值范围 ...
- matlab图形中添加文本框
图形中添加文本框,自己目前了解到了两种方法:1.用legend函数就可以对图形标注,形成一个文本框: 2.就是用annotation('textbox',[0.2,0.2.0.1,0.3],'Line ...
- Linux-系统的延时和定时
1.系统的延时任务 at 时间 时间后回车 就可以进入编辑了 完成后按ctrl+d提交 at 09:46 #设定任务的执行时间 at> touch /mnt/file{1..9} #任务的动作 ...
- MySQL 8.0.13(Windows压缩版本)下载安装教程
MySQL下载安装教程 1.首先在百度上搜索mysql 2.点击链接进去,找到对应的路径 3.进去之后,可以看到版本是8.0.13,以及最下面有个Download按钮,点击下载 4.之后会跳转到开始下 ...
- 自学java一路以来,心血心得整理分享
✿ 贴心提示:文章内容比较长,但都是干货,请大家耐心看完.时间不够充裕的小伙伴,建议收藏,一定要耐心看完,保证对你有后续学习java有所帮助. 一.推荐背景介绍 (一)我是怎么学的? ★ 非常普通的人 ...
- .Net Core(.NET6)中接入Log4net和NLog进行日志记录
一.接入Log4net 1.按日期和大小混合分割日志 nuget包安装 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore 配置文件 配置文 ...
- linux下更改文件字符格式为uft-8
liunx下发布的.net Core 程序,发现短信签名不错误不能发出.后来检查发现配配文件中的字符为乱码才知道是因为字符格式问题. 因为服务器批较多,还是使用命令来解决比较快.使用iconv来更改. ...
- SoftwareTeacher直播自我感想
今天老师发布了一个链接直播是关于:同学们聊聊学习软件工程,CS 课程的问题下面是我的个人感悟和笔记 一.编程技术的提升 编程并不是一件很难的事情,就如开车一样,只有多加练习,自己的技术才能提升上去.拿 ...
- LGP2891题解
题目大意 有 \(n\) 只奶牛,\(q\) 种食物和 \(p\) 种饮料,每只奶牛喜欢一些饮料和食物,但只能那一种,求最小配对数量. 首先来看一下这道题的简化版:没有饮料,该怎么做呢? 我会!裸的二 ...