[设计模式]第三回:抽象工厂模式(Abstract Factory)
概述
在系统中往往会有这种需求,客户端会用到很多对象,而且根据需求变化很可能会切换成另外一套对象。抽象工厂模式可以提供一种封装机制来面对这种需求。
实践
物理模型:
皮肤主题:设计一个可以切换皮肤主题,切换为 黑色 和灰色样式,每个元素的样式都要单独定义,如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 一.场景描述 ...
随机推荐
- TCP连接与关闭
1.建立连接协议(三次握手) (1)客户端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1. (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和S ...
- 1.NopCommerce下载与安装
NoCommerce是基于微软ASP.NET MVC + EntityFramework 技术开发的一套开源电子商城系统,其架构与设计非常精妙被誉为.NET商城的经典之作. 作为一个.NET程序爱好者 ...
- 如此低价的ZBrush,你能想象?
作为3D艺术的狂热者,你是否曾为找不到一款适合自己的雕刻软件而苦恼?要么,你已经找到了,却因为昂贵的价格而迟迟不肯入手? 作为改变整个三维行业的业界先进的数字雕刻和绘画软件,ZBrush向来拥有广 ...
- Redis漏洞?阿里云被攻击!
今天运维那边过来说阿里云服务器进程被占用很多,后来查了一下进程发现了这个玩意: 小编我看不懂,经运维先森仔细研究,发现这是被注入进来的一个进程,服务器被当成了肉鸡,专门用来跑比特币的,这样对方就不需要 ...
- uGUI练习(七) Drag And Drop
练习目标 练习UI的拖放操作 一.相关组件 EventTrigger Canvas Group ScrollRect Mask Scrollbar 二.拖放练习 1.创建一个Panel,命名Panel ...
- AutoIT删除Internet临时文件
搜集了几个超赞的方法: 1.删除临时文件 Temporary Internet Files:RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8 2. 删 ...
- 入门Linux
45分钟带你入门Linux(附:笔者在工作室开讨论班录制的视频讲解) 第一部分 熟悉Linux基本操作 一.初识Linux 1.Linux特点 ◊ 开放性 ◊ 多用户 ◊ 多任务 ◊ ...
- qrcodeJS生成二维码
后续抽时间自己来整理笔记 http://code.ciaoca.com/javascript/qrcode/
- 实践SQLServer Tuning
已有的系统业务数据属性多,表之间关系紧密.单表数据量(5481 row(s) affected)级别(其中三四个主表),其他表数据量较小. 0)使用set statistics生成辅助信息参考. se ...
- 自定义progressBar的旋转圆圈
在手工打造下拉刷新功能 自带的progressBar太丑了 做个也不费事,一个简单的圆形 旋转动画加type是sweep的gradient渐变 <rotate //旋转动画xmlns:andro ...