设计模式:抽象工厂方法模式
今天说一下抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么,这样一来,客户就从具体的产品中被解耦
我之前说过设计模式:工厂方法模式,我们最后会做一下两种模式的区别
我们看用类图看一下这个模式
每个抽象产品都有多于一个的一个人的具体子类,工厂角色怎么知道实例化哪一个子类?比如我们这个图,每个抽象产品都有两个具体产品,
抽象工厂有两个具体的工厂,分别对应这两个具体产品角色,每一个具体工厂只负责某一个家族的产品的实例化
我们来看一下代码
#region 抽象工厂模式
#region 产品
#region 产品A
/// <summary>
/// 抽象产品A
/// </summary>
public abstract class ProductA
{
}
public class ConcreteProductA1 : ProductA
{
public ConcreteProductA1()
{
Console.WriteLine("ProductA的ConcreteProductA1...A1");
}
}
public class ConcreteProductA2 : ProductA
{
public ConcreteProductA2()
{
Console.WriteLine("ProductA的ConcreteProductA2...A2");
}
}
#endregion
#region 产品B
/// <summary>
/// 抽象产品B
/// </summary>
public abstract class ProductB
{
}
public class ConcreteProductB1 : ProductB
{
public ConcreteProductB1()
{
Console.WriteLine("ProductB的ConcreteProductB1类...B1");
}
}
public class ConcreteProductB2 : ProductB
{
public ConcreteProductB2()
{
Console.WriteLine("ProductB的ConcreteProductB2类...B2");
}
}
#endregion
#endregion
#region 工厂类
public abstract class Creator
{
public abstract ProductA CreateProductA();
public abstract ProductB CreateProductB();
}
public class ConcreteCreatorA : Creator
{
public override ProductA CreateProductA()
{
return new ConcreteProductA1();
}
public override ProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
public class ConcreteCreatorB : Creator
{
public override ProductA CreateProductA()
{
return new ConcreteProductA2();
}
public override ProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
#endregion
#endregion
//Client
static void Main(string[] args)
{
#region 抽象工厂模式
Creator _creatorA = new ConcreteCreatorA();
_creatorA.CreateProductA();
_creatorA.CreateProductB();
Creator _creatorB = new ConcreteCreatorB();
_creatorB.CreateProductA();
_creatorB.CreateProductB();
#endregion
Console.ReadLine();
}
抽象工厂模式除了具有工厂方法模式的做点外,主要就是可以在类的内部对产品族进行约束。所谓的产品族一般都有一定的联系,抽象工厂模式就可以
在类内部对产品族的关联关系进行描述,而不必专门引入一个新的类来进行管理。抽象模式最大的缺点就是产品族的扩展,如果要加一个新的产品,差不多所有
的工厂类都需要进行修改,所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
这们来说一个抽象工厂模式和工厂模式的区别:
我们看一下抽象模式的类图:设计模式:工厂方法模式
工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个
- 为 WordPress 后台管理菜单自定义排序
- WordPress 添加个性化的博客宠物(妹纸篇)
- WordPress 添加个性化的博客宠物(汉纸篇)
- WordPress 退出(登出)的时候跳转到首页
- WordPress免插件仅代码实现面包屑导航
- 开源的作业调度框架 - Quartz.NET
- Windows Server 2003网络负载均衡的实现
- 使用 ETW 对 .NET 应用程序进行性能诊断
- ORB_SLAM论文解读
- Mono.Addins 插件式框架
- 通过多说服务器缓存加速Gravatar 头像,解决被墙问题
- asp.net mvc脚手架代码生成工具
- Page.FindControl方法找不到指定控件的原因
- Silverlight 2 DispatcherTimer和通过XAML创建UI元素
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法