概述
在系统中往往会有这种需求,客户端会用到很多对象,而且根据需求变化很可能会切换成另外一套对象。抽象工厂模式可以提供一种封装机制来面对这种需求。
实践
物理模型:
皮肤主题:设计一个可以切换皮肤主题,切换为 黑色 和灰色样式,每个元素的样式都要单独定义,如Input的样式,button的样式,这些所有的元素样式组成一套皮肤主题。
根据模型,先抽象,每种元素相当于一种产品,如button
/// <summary>
/// Button按钮样式
/// </summary>
public interface IButton
{
int Border { get; }
string BackColor { get; }
}
然后 具体实现它
/// <summary>
/// 灰色按钮样式
/// </summary>
public class GrayButton : IButton
{
public GrayButton()
{
Border = ;
BackColor = "#ccc";
}
public int Border { get; set; }
public string BackColor { get; set; }
}
/// <summary>
/// 黑色按钮样式
/// </summary>
public class BlackButton : IButton
{
public BlackButton()
{
Border = ;
BackColor = "#fff";
}
public int Border { get; set; }
public string BackColor { get; set; }
}
上面是一种html元素,其它元素的样式类似
/// <summary>
/// 文本框
/// </summary>
public interface IInput
{
int Border { get; }
}
/// <summary>
/// 灰色文本框样式
/// </summary>
public class GrayInput : IInput
{
public GrayInput() { Border = ; }
public int Border { get; set; }
}
/// <summary>
/// 黑色文本框样式
/// </summary>
public class BlackInput : IInput
{
public BlackInput() { Border = ; }
public int Border { get; set; }
}
产品抽象完后,接下来抽象工厂
/// <summary>
/// 抽象工厂
/// </summary>
public interface IThemesFactory
{
IButton CreateButton();
IInput CreateInput();
}
具体主题样式工厂
/// <summary>
/// 创建灰色样式工厂
/// </summary>
public class GrayFactory : IThemesFactory
{
public IButton CreateButton()
{
return new GrayButton();
} public IInput CreateInput()
{
return new GrayInput();
}
}
其它主题工厂类似
/// <summary>
/// 黑色主题样式工厂
/// </summary>
public class BlackFactory : IThemesFactory
{
public IButton CreateButton()
{
return new BlackButton();
} public IInput CreateInput()
{
return new BlackInput();
}
}
客户端调用
/// <summary>
/// 主题
/// </summary>
public class ThemesMain
{
public void Main()
{
//灰色主题工厂
IThemesFactory factory = new GrayFactory();
//按钮样式
IButton button = factory.CreateButton();
//文本框样式
IInput input = factory.CreateInput();
}
}
小结
抽象工厂适用于一系列的对象的创建和切换,如 数据库配置有 MsSql,MySql,每种数据库下的 查询User 都是不一样,可以抽象工厂,写两套,客户端方便切换。
抽象工厂优点:
- 客户端Main 里 都是使用抽象产品如IButton 不依赖具体的产品创建,而统一由工厂方法创建;
- 切换产品方便,只需要切换工厂,接下来的由工厂创建的产品也就切换了;
- 易扩展,如后续加产品,只需在工厂里创建出来就行,客户端不用改。
缺点:
- 代码量大,由于抽象有工厂接口,有产品接口;
- 修改量大,如有修改现有的产品,可能从接口修改到具体,全改一遍。
[设计模式]第三回:抽象工厂模式(Abstract Factory)的更多相关文章
-
.NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)
概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...
-
设计模式之十一:抽象工厂模式(Abstract Factory)
抽象工厂模式: 提供了一个创建一系列相关的或相互依赖的对象的接口而不须要详细指定它们的类型. Provide an interface for creating families of related ...
-
PHP设计模式(三)抽象工厂模式(Abstract Factory)
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...
-
【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
-
Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
-
乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
-
【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern
概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...
-
设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释
抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...
-
二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
-
抽象工厂模式(Abstract Factory)C#实例
抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...
随机推荐
-
H5+ 移动app学习之二 Native.js
Native.js技术,简称NJS,是一种将手机操作系统的原生对象转义,映射为JS对象,在JS里编写原生代码的技术.如果说Node.js把js扩展到服务器世界,那么Native.js则把js扩展到手机 ...
-
HTML5获取地理位置
包含了以下功能:(1)通过IP地址获取城市地址(并不完全准确,存在代理IP或IP中转时定位与实际位置不一致的情况)(2)通过移动端浏览器及GPS定位位置坐标(3)根据位置坐标转换百度地图坐标(4)根据 ...
-
2016年12月15日 星期四 --出埃及记 Exodus 21:10
2016年12月15日 星期四 --出埃及记 Exodus 21:10 If he marries another woman, he must not deprive the first one o ...
-
adb_常用命令
1. adb push 电脑中的文件(包含路径) Android中的绝对路径 2. adb pull Android中的绝对路径文件 电脑中的绝对路径 3. adb install ??.ap ...
-
总结配置搭建tomcat时碰到的一些小问题
1.环境变量的配置 在配置tomcat的环境变量时始终配置不对,于是首先检查之前java的环境变量是否正确,发现java命令可以用但是javac却找不到,自己又瞎搞一通,终于javac可以用了,但ja ...
-
基于visual Studio2013解决C语言竞赛题之0205位数求和
题目
-
Codevs 5590 A+B 问题 超级版
5590 A+B 问题 超级版 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 青铜 Bronze 题目描述 Description 不用+-*/%计算A+B 输入描述 Input De ...
-
ASP.NET使用WebApi接口实现与Android客户端的交互(图片或字符串的接收与回传)
最近在使用WebApi 做下记录 //此接口实现接收Android客户端上传的JSON格式的信息,并返回"nihao"字符串 [Route("ReceiveData& ...
-
volatile和synchronized实现内存可见性的区别
先看看synchronized实现内存可见性 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性.我们不仅希望防止某个线程正在使用对象状态而另一个 ...
-
第七周学习总结-C#
2018年8月26日 这个周二突然得知另一位老师留的暑假作业,群文件里早就上传了,我居然一直没翻到那里,要不是同学问作业做完没,我可能开学就要“真●裸考”了