您的位置:首页 > 其它

抽象工厂模式(Abstract Factory Pattern)

2014-01-10 16:52 423 查看
动机(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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: