概述

在系统中往往会有这种需求,客户端会用到很多对象,而且根据需求变化很可能会切换成另外一套对象。抽象工厂模式可以提供一种封装机制来面对这种需求。

实践

物理模型:

皮肤主题:设计一个可以切换皮肤主题,切换为 黑色 和灰色样式,每个元素的样式都要单独定义,如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)的更多相关文章

  1. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  2. 设计模式之十一:抽象工厂模式(Abstract Factory)

    抽象工厂模式: 提供了一个创建一系列相关的或相互依赖的对象的接口而不须要详细指定它们的类型. Provide an interface for creating families of related ...

  3. PHP设计模式(三)抽象工厂模式(Abstract Factory)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  4. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  5. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  6. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  7. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  8. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  9. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  10. 抽象工厂模式(Abstract Factory)C#实例

    抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...

随机推荐

  1. EM basics- the Maxwell Equations

    All the two important problems that the EM theory trys to describe and explain are propogation and r ...

  2. 【Android UI设计与开发】2.引导界面(二)使用ViewPager实现欢迎引导页面

    1.实现的效果 2.编码前的准备工作 ViewPager是Android3.0之后提供的新特性,所以要想让你的应用向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自 ...

  3. 网页中插入FLASH(swf文件),并且让Flash不遮挡HTML元素

    一:网页中插入flash代码如下:  当然里面的很多属性可以去掉,根据具体的需求而定.  我们在网页中经常遇到播放flash,要正常播放flash就要用到OBJECT和EMBED这两个标签.鉴于火狐及 ...

  4. 2014 Super Training #10 C Shadow --SPFA/随便搞/DFS

    原题: FZU 2169 http://acm.fzu.edu.cn/problem.php?pid=2169 这题貌似有两种解法,DFS和SPFA,但是DFS怎么都RE,SPFA也要用邻接表表示边, ...

  5. MySQL遇到check the manual that corresponds to your MySQL server version for the right syntax错误

    用MySQL新建了一个Order表,插入了一条数据.总是显示 You have an error in your SQL syntax; check the manual thatcorrespond ...

  6. Sublime Text2 安装Package Control

    Sublime Text2是一款轻量级的妖娆的编辑器,想要更多私人定制功能的第一步就是安装Package  Control 这是官网的安装方法: Click the Preferences >  ...

  7. 限制站点目录防止跨站的三种方案(使用open_basedir)

    nginx结合php的时候,可以使用open_basedir限制站点目录防止跨站具体实现方法有以下三种:注意:以下三种设置方法均需要PHP版本为5.3或者以上. 方法1)在Nginx配置文件中加入fa ...

  8. POJ 2406 Power Strings

    F - Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

  9. 14SpringMvc_在业务控制方法中写入HttpServletRequest,HttpServletResponse等传统web参数(这个知识点知道就好了,不推荐这么去做)

    这篇文章解决的问题是怎么在业务方法里面引入我们熟悉的HttpServletRequest和HttpServletRespon? 答案:这种引入传统的web参数的做法不推荐去做,因为这么做会实行高度耦合 ...

  10. pc加入域认证细节

    计算机组织形式 工作组(无法统一管理,无法统一身份验证) 域 win权限分配机制 管理本地用户 新建用户-加入管理员组. 针对文件夹基于(用户组)设置权限 用户SID 创建一个用户时候,每个用户都有一 ...