相比于工厂模式,抽象工厂模式的每个工厂可以创建产品系列,而不是一个产品;

抽象工厂用到的技术:接口、多态、配置文件、反射;

抽象工厂模式的设计原则:

  • 实现客户端创建产品和使用产品的分离,客户端无须了解创建的细节,符合迪米特法则;
  • 客户端面向接口定义产品,符合依赖倒置原则;
  • 客户端面向接口定义工厂,而实际根据配置文件生成工厂实现类,符合里氏替换原则;
  • 增加新的产品族时,无须修改原有代码,符合开闭原则;
  • 使用配置文件,而不是硬编码方式指定创建的具体工厂,符合迪米特法则;
  • 相较于简单工厂模式,抽象工厂中,一个工厂只负责某一产品系列的创建,而不是所有产品的创建,符合单一职责原则;

类图 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();
}
}

运行结果:

最新文章

  1. Quartz.NET开源作业调度框架系列(四):Plugin Job
  2. IIS中查看W3P.exe进程对应的应用程序池的方法
  3. JAVA I/O系统
  4. YOU ARE MY SUNSHINE
  5. JS判断数据是否是JSON类型
  6. SpringMvc中的反射
  7. nodejs快速入门
  8. DevExpress GridView 自定义搜索按钮改为中文内容
  9. SQL Server查询所有用户表
  10. 【HDOJ】2722 Here We Go(relians) Again
  11. extjs tree check 级联选择
  12. kinit manual
  13. SVN不同图标的不同意义
  14. 前端MVVM框架:Knockout.JS(一)
  15. bootstrap模态框远程加载网页的正确处理方式
  16. word2vec初探(用python简单实现)
  17. Windows下Java调用BAT批处理不弹出cmd窗口
  18. [hashcat]基于字典和暴力破解尝试找到rar3-hp的压缩包密码
  19. .NET页面导出Excel
  20. webpack 与 vue 打包体积优化

热门文章

  1. QUIC协议详解
  2. .net core 学习笔记一 Program与Startup
  3. fibnacci数列的python实现
  4. 理解 Events Loop 宏任务微任务
  5. 使用Geth 构建以太坊区块链并模拟挖矿过程
  6. Linux移植到自己的开发板(一)环境搭建
  7. MSSQL得知密码后getshell
  8. python 命令行参数学习(二)
  9. bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
  10. 《前端运维》四、Jenkins--持续构建