抽象工厂模式(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)
抽象工厂模式概述 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 抽象工厂抽象工厂,顾名思义,就是比工厂模式更抽象的工厂模式.在工厂模式中,一个具体工厂只负责生产一个具体产品 ...
随机推荐
- 如何实现修改FileUpload样式
这里先隐藏FileUpload 然后用一个input button和一个text来模拟FileUpload 具体代码为 <asp:FileUpload ID="FileUpload1& ...
- system_call中断处理过程
张雨梅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 1.给menuos添加命令 改 ...
- WinForm中MouseEnter和MouseLeave混乱的问题
MouseEnter+MouseLeave不行,我用了MouseMove+MouseLeave,效果一样 最近做个聊天的系统,仿照qq的界面设计,像qq聊天界面中字体.表情.截图等图片,鼠标放上去显示 ...
- linux网卡混杂模式
混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包,即不验证MAC地址.普通模式下网卡只接收发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃.一般来说,混杂模式不会影响网卡的正常工作 ...
- angularJS 学习之路
AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 AngularJS 应用程序.也就是angularjs作用的入口 作用在什么标签或者整个body ...
- Jquery动态操作checkbox
问题的由来:html页面中使用checkbox给新建用户授权,然后提交到后台服务器,完成给用户授权.用户授权完成之后,如果用户的权限发生改变管理员需要修改多个用户的权限或查看某用户的权限,点击不同的用 ...
- DynamicsCRM中的自动保存
DynamicsCRM的自动保存功能 在DynamicsCRM2013开始,引入了自动保存功能. 保存一条记录 在新建一条记录的时候, 你必须在左上角手动点击保存按钮.如下图: 当保存完后,会发现,左 ...
- (转抄:人人都是产品经理——iamsujie)如何提高产品规划PPT的能力
做产品几年之后,不可避免的要碰到写规划这件事儿,虽说不少人,不乏大牛,对规划持“无用论”的观点, 但大多数人其实还是更相信这个段子: 在一个公司里,看一个人的地位,主要看他平时写的文档类型——写wor ...
- JavaScipt 事件体系
事件机制 jQuery对事件的绑定分别有几个API .bind()/.live()/.delegate()/.on() 不管是用什么方式绑定,归根到底还是用addEventListener/attac ...
- 每个部门绩效成绩第二名 sql server 查询 ( 替代 not in )
原题: 集团中有多个部门,部门底下有多个员工,求每个部门绩效分数排名第二的人员,数据表结构如下: DEPAR NAME SCORE A ...