抽象工厂模式(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)
抽象工厂模式概述 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 抽象工厂抽象工厂,顾名思义,就是比工厂模式更抽象的工厂模式.在工厂模式中,一个具体工厂只负责生产一个具体产品 ...
随机推荐
- activity通过onActivityResult间数据交互
首先要创建2个activity 分别为MainActivity和OneActiivity MainActivity代码如下: package com.tp.soft.app; import andro ...
- File API 读取上传的文件
1, 在html 文档中,<input type="file"> 我们可以选择文件进行上传,但这时只能上传一个文件.如果加上multiple 属性,可以上传多个文件,上 ...
- miniui
//android提供了一个库minui用于简单的UI输出,源码在bootable/recovery/minui中, //gr_init()和gr_font_size()为minui库提供方法,gr_ ...
- eclipse下的,maven+spring+springMVC+mabatis+mysql.创建
环境:window系统,64位工具:eclipse:下载地址: 链接:http://pan.baidu.com/s/1hr73LE8 密码:vcsa tomcat: ...
- javadoc相关问题
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- 如何判断Javascript对象是否存在
Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: ...
- js递归方法创建节点
var jsonData = [{,,"subnetRemark":"状态自带","subnetName":"中心网络" ...
- 【转】Pycharm的激活
如果要基于Python进行开发的话,那么pycharm是个不错的选择,试用一个月以后需要激活,原文如下: 原文链接:http://blog.csdn.net/lanchunhui/article/de ...
- Nodejs express中创建ejs项目,解决express下默认创建jade,无法创建ejs问题
最近在看<Node.js开发指南>,看到使用nodejs进行web开发的时候,准备创建ejs项目遇到问题了, 书上命令为: express -t ejs microblog 可是执行后,仍 ...
- JS 面向对象、prototype原型的克隆
JS中的phototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个 ...