概述

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

实践

物理模型:

皮肤主题:设计一个可以切换皮肤主题,切换为 黑色 和灰色样式,每个元素的样式都要单独定义,如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. php databases support off fail zabbix

    php  安装参数./configure --prefix=/usr/local/php   --with-config-file-path=/usr/local/php/etc  --enable- ...

  2. apache加载php配置

    #载入php模块和ini路径,以及凡是.php开头的以它来处理 LoadModule php5_module E:/server/php/php5apache2_2.dll PHPIniDir &qu ...

  3. [转]后台页面访问权限:页面基类&内置票据认证 使用方法

    本文转自:http://www.cnblogs.com/fishtreeyu/archive/2011/01/29/1947421.html 一般网站后台页面除了登录页面login.aspx未登录用户 ...

  4. [转]MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验

    本文转自:http://liangweilinux.blog.51cto.com/8340258/1728131 年,嘿,废话不多说,下面开启MySQL优化之旅! 我们究竟应该如何对MySQL数据库进 ...

  5. 第05篇. Tomcat和JDK的内存配置

    站在人群,我毫不起眼:活在世上,我不玩心眼! 没有那么远大的目标,但是也不要把我当成傻子! --胖先生 放在前面要说的话:JVM内存分配设置的参数有四个 -Xmx Java Heap最大值,默认值为物 ...

  6. 边工作边刷题:70天一遍leetcode: day 71

    Longest Substring with At Most Two Distinct Characters # Given a string, find the length of the long ...

  7. Debian安装中文输入法

    简单暴力: apt-get install ibus-pinyin 你也可以通过GUI下面到Synaptic Package Manager里面选中ibus-pinyin进行安装 安装完成后重启计算机 ...

  8. HDU 2491 Priest John's Busiest Day

    贪心.. #include<iostream> #include<string.h> #include<math.h> #include <stdio.h&g ...

  9. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

  10. Adobe Scout 入门

    http://www.adobe.com/cn/devnet/scout/articles/adobe-scout-getting-started.html Adobe Scout 是新一代 Flas ...