抽象工厂模式(Abstract Factory Pattern)
动机(Motivation)
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?
意图(Intent)
提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。
Abstract Factory模式的几个要点
(1) 如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的静态工厂完全可以。
(2)“系列对象”指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中的“道路”与“房屋”的依赖,“道路”与“地道”的依赖。
(3) Abstract Factory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。
(4) Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。
namespace 抽象工厂
{
public interface IHuman
{
void GetColor();
void GetGender();
}
} namespace 抽象工厂
{
public abstract class MaleHuman : IHuman
{
public abstract void GetColor(); public void GetGender()
{
Console.WriteLine("男人就是累啊!");
}
}
} namespace 抽象工厂
{
public abstract class FemaleHuman:IHuman
{
public abstract void GetColor(); public void GetGender()
{
Console.WriteLine("女人也顶半边天!");
}
}
} namespace 抽象工厂
{
public class WhiteMaleHuman : MaleHuman
{
public override void GetColor()
{
Console.WriteLine("我是白人,我真白");
}
}
} namespace 抽象工厂
{
public class WhiteFemaleHuman : FemaleHuman
{
public override void GetColor()
{
Console.WriteLine("我是白人,我真白!");
}
}
} namespace 抽象工厂
{
public class BlackMaleHuman : MaleHuman
{
public override void GetColor()
{
Console.WriteLine("我是黑人,我真壮!");
}
}
} namespace 抽象工厂
{
public class BlackFemaleHuman : FemaleHuman
{
public override void GetColor()
{
Console.WriteLine("我是黑人,我真壮!");
}
}
} namespace 抽象工厂
{
public class YellowMaleHuman : MaleHuman
{
public override void GetColor()
{
Console.WriteLine("我是黄种人,我骄傲!");
}
}
} namespace 抽象工厂
{
public class YellowFemaleHuman : FemaleHuman
{
public override void GetColor()
{
Console.WriteLine("我是黄种人,我骄傲!");
}
}
} namespace 抽象工厂
{
interface IFactory
{
IHuman CreateMaleHuman();
IHuman CreateFemaleHuman();
}
} namespace 抽象工厂
{
public class WhiteHumanFactory:IFactory
{
public IHuman CreateMaleHuman()
{
return new WhiteMaleHuman();
} public IHuman CreateFemaleHuman()
{
return new WhiteFemaleHuman();
}
}
} namespace 抽象工厂
{
public class BlackHumanFactory : IFactory
{
public IHuman CreateMaleHuman()
{
return new BlackMaleHuman();
} public IHuman CreateFemaleHuman()
{
return new BlackMaleHuman();
}
}
} namespace 抽象工厂
{
public class YellowHumanFactory : IFactory
{
public IHuman CreateMaleHuman()
{
return new YellowMaleHuman();
} public IHuman CreateFemaleHuman()
{
return new YellowMaleHuman();
}
}
} namespace 抽象工厂
{
class Program
{
static void Main(string[] args)
{
IFactory whiteHumanFactory = new WhiteHumanFactory();
IHuman whiteMaleHuman = whiteHumanFactory.CreateMaleHuman();
whiteMaleHuman.GetColor();
whiteMaleHuman.GetGender(); IHuman whiteFemaleHuman = whiteHumanFactory.CreateFemaleHuman();
whiteFemaleHuman.GetColor();
whiteFemaleHuman.GetGender(); IFactory blackHumanFactory = new BlackHumanFactory();
IHuman blackMaleHuman = blackHumanFactory.CreateMaleHuman();
blackMaleHuman.GetColor();
blackMaleHuman.GetGender(); IHuman blackFemaleHuman = blackHumanFactory.CreateFemaleHuman();
blackFemaleHuman.GetColor();
blackFemaleHuman.GetGender(); IFactory yellowHumanFactory = new YellowHumanFactory();
IHuman yellowMaleHuman = yellowHumanFactory.CreateMaleHuman();
yellowMaleHuman.GetColor();
yellowMaleHuman.GetGender(); IHuman yellowFemaleHuman = yellowHumanFactory.CreateFemaleHuman();
yellowFemaleHuman.GetColor();
yellowFemaleHuman.GetGender(); Console.ReadKey();
}
}
}
抽象工厂模式(Abstract Factory Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释
抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...
- 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
- 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern
概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...
- Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)
一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...
- 设计模式之抽象工厂模式(Abstract Factory Pattern)
一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...
- C#设计模式——抽象工厂模式(Abstract Factory Pattern)
一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...
- 六个创建模式之抽象工厂模式(Abstract Factory Pattern)
问题: 使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护.因此可以考虑使用一个工厂创建一个产品族. 定义: 提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品 ...
- 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式概述 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 抽象工厂抽象工厂,顾名思义,就是比工厂模式更抽象的工厂模式.在工厂模式中,一个具体工厂只负责生产一个具体产品 ...
随机推荐
- iis设置asp站点
在 IIS 6.0 中,默认设置是特别严格和安全的,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击.譬如说默认配置数据库属性实施的最大 ASP 张贴大小为 204,800 个字节,并将各个 ...
- Linux 常见问题解决办法
1.用户切换后显示 -bash-4.1 $ 表示该用户下的配置文件缺失,切换到该用户下(-bash-4.1),使用命令查(pwd)看用户所在位置.如 /home/gpadmin. 使用 cp -a / ...
- Hadoop中wordcount程序
一.测试过程中 输入命令: 首先需要在hadoop集群中添加文件 可以首先进行查看hadoop集群中文件目录 hadoop fs -ls / hadoop fs -ls -R / hadoop fs ...
- 数据挖掘算法(一)C4.5
统计了14天的气象数据D(指标包括outlook,temperature,humidity,windy),并已知这些天气是否打球(play).如果给出新一天的气象指标数据:sunny,cool,hig ...
- resolv.conf
1 这个文件由NetworkManager和network服务共同修改 关闭NetworkManager服务后,修改nameserver和hostname 重启network后,nameserver更 ...
- 无法启动xwindow
1 新建一个lqx用户,执行startx命令出现: Fatal server error: PAM authentication failed, cannot start X server. perh ...
- iOs基础篇(二十二)—— UIPickerView、UIDatePicker控件的使用
一.UIPickerView UIPickerView是一个选择器控件,可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活. 1.常用属性 (1)num ...
- PDF 补丁丁 0.5.0.2520 测试版发布:新春快乐!
新的PDF测试版今天发布了. 新的测试版比旧测试版本增加了如下功能: 合并文件功能可以导出.导入文件列表,方便合并大量文件.一天干不完,保存一下,明天继续来. 合并文件功能可以统一已合并文件的旋转方向 ...
- CodeForces #368 div2 D Persistent Bookcase DFS
题目链接:D Persistent Bookcase 题意:有一个n*m的书架,开始是空的,现在有k种操作: 1 x y 这个位置如果没书,放书. 2 x y 这个位置如果有书,拿走. 3 x 反转这 ...
- WPF中Grid布局
WPF中Grid布局XMAl与后台更改,最普通的登录界面为例. <Grid Width="200" Height="100" > <!--定义 ...