动机(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)的更多相关文章

  1. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  2. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  3. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  4. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  5. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  6. Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  7. 设计模式之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...

  8. C#设计模式——抽象工厂模式(Abstract Factory Pattern)

    一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...

  9. 六个创建模式之抽象工厂模式(Abstract Factory Pattern)

    问题: 使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护.因此可以考虑使用一个工厂创建一个产品族. 定义: 提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品 ...

  10. 抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式概述 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 抽象工厂抽象工厂,顾名思义,就是比工厂模式更抽象的工厂模式.在工厂模式中,一个具体工厂只负责生产一个具体产品 ...

随机推荐

  1. jq pagination分页 全选、单选的思考

    $().pagination(总条数,配置项); 后端分页的跨页选择: 思路:把浏览过的页整体保存为,整体拥有 curPage(当前页码).allChoice(当前页是否全选).selected当前页 ...

  2. Linux 系统时间和硬件时间

    linux 的系统时间有时跟硬件时间是不同步的 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟.系统时钟是指当前Linux Kernel ...

  3. EasyUI的combobox控件使用onchange 问题

    在项目中几次都遇到了同样的问题,现在都不知道怎样解决了! 路过的朋友们帮我看看嘛!谢谢了! 最后我想要实现的效果是这样的.   在下拉列表中不存在值.(这里的是下拉列表中存在值的!)  但是在我输入值 ...

  4. 02.JavaScript 面向对象精要--函数

    在JavaScript中,函数其实也是对象.是函数不同于其他对象的特点是:函数存在一个被称为[[Call]]的内部属性.[[Call]]属性是函数独有的,表明该对象可以被执行.ECMAScript 定 ...

  5. python画图

    正弦图像: #coding:utf-8import numpy as npimport matplotlib.pyplot as pltx=np.linspace(0,10,1000)y=np.sin ...

  6. Head First 设计模式-- 总结

    模式汇总:装饰者 :包装一个对象以得到新的行为状态   :封装了基于状态的行为,并使用委托在行为之间切换迭代器 :在对象的结合中游走,而不暴露集合的实现外观   :简化一群类的接口策略   :封装可以 ...

  7. 开发微信小程序 中遇到的坑 及解决方法

    1.wx.request 只能访问 https 解决: 新建项目  不填appid  即可访问 localhost 2.页面中多重三元表达式  解析有问题 解决: <!--{{index}} { ...

  8. 1. AE二次开发——地图的基本操作(加载地图文档,加载shape,加载mdb,地图的保存,缩放,漫游)

    1. 加载数据Icommand方法 ICommand Butdata = new ControlsAddDataCommandClass(); Butdata.OnCreate(axMapContro ...

  9. 在VC++6.0开发中实现全屏显示

    全屏显示是一些应用软件程序必不可少的功能.比如在用VC++编辑工程源文件或编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“Esc”键后会退出全屏显示状态. ...

  10. Spring——jar包详解(转)

    Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...