要点:
1、如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的静态工厂完全可以;
2、“系列对象” 指的是这些对象之间相互依赖、或作用的关系,例如游戏场景当中的“房屋”和“道路”的依赖,“道路”与“地道”的依赖;
3、工厂模式主要应用于对新系列的变动,其缺点在于难于应付新对象的需求变动;
4、Abstract Factory模式经常与Factory Method模式共同组合来应对“对象创建”的需求变化;
代码示例:
using
System;
namespace Design_Pattern
{
public class Computer
{
private RAM Ram;
private CPU Cpu;
public Computer(RAM ram,CPU cpu)
{
this .Ram = ram;
this .Cpu = cpu;
Console .WriteLine(A Computer is Composed ! + this .Ram + + this .Cpu );
}
}
public abstract class RAM
{
public abstract Computer ComposeAComputer(CPU cpu);
}
public abstract class CPU
{
public abstract Computer ComposeAComputer(RAM ram);
}
public class pcRAM:RAM
{
public override Computer ComposeAComputer(CPU cpu)
{
Console .WriteLine (pcComputer...);
return new Computer( this ,cpu);
}
}
public class pcCPU:CPU
{
public override Computer ComposeAComputer(RAM ram)
{
Console .WriteLine (pcComputer...);
return new Computer(ram, this );
}
}
public class macRAM:RAM
{
public override Computer ComposeAComputer(CPU cpu)
{
Console .WriteLine (MacComputer...);
return new Computer( this ,cpu);
}
}
public class macCPU:CPU
{
public override Computer ComposeAComputer(RAM ram)
{
Console .WriteLine (MacComputer...);
return new Computer(ram, this );
}
}
public abstract class abstractFactory
{
public abstract RAM CreateRam();
public abstract CPU CreateCpu() ;
}
public class PcFactory:abstractFactory
{
public override RAM CreateRam()
{
return new pcRAM();
}
public override CPU CreateCpu()
{
return new pcCPU();
}
}
public class MacFactory:abstractFactory
{
public override RAM CreateRam()
{
return new macRAM();
}
public override CPU CreateCpu()
{
return new macCPU();
}
}
class ITMarket
{
private RAM ram;
private CPU cpu;
public ITMarket(abstractFactory factory)
{
this .ram = factory.CreateRam();
this .cpu = factory.CreateCpu();
}
public void Run()
{
ram.ComposeAComputer(cpu);
cpu.ComposeAComputer(ram);
}
}
class ClientApp
{
public static void Main( string [] args)
{
Console .WriteLine(PC Factory..... );
abstractFactory pcfactory = new PcFactory ();
ITMarket itMarket = new ITMarket (pcfactory);
itMarket .Run ();
Console .WriteLine(MAC Factory..... );
abstractFactory macfactory = new MacFactory();
itMarket = new ITMarket (macfactory);
itMarket .Run ();
}
}
}
namespace Design_Pattern
{
public class Computer
{
private RAM Ram;
private CPU Cpu;
public Computer(RAM ram,CPU cpu)
{
this .Ram = ram;
this .Cpu = cpu;
Console .WriteLine(A Computer is Composed ! + this .Ram + + this .Cpu );
}
}
public abstract class RAM
{
public abstract Computer ComposeAComputer(CPU cpu);
}
public abstract class CPU
{
public abstract Computer ComposeAComputer(RAM ram);
}
public class pcRAM:RAM
{
public override Computer ComposeAComputer(CPU cpu)
{
Console .WriteLine (pcComputer...);
return new Computer( this ,cpu);
}
}
public class pcCPU:CPU
{
public override Computer ComposeAComputer(RAM ram)
{
Console .WriteLine (pcComputer...);
return new Computer(ram, this );
}
}
public class macRAM:RAM
{
public override Computer ComposeAComputer(CPU cpu)
{
Console .WriteLine (MacComputer...);
return new Computer( this ,cpu);
}
}
public class macCPU:CPU
{
public override Computer ComposeAComputer(RAM ram)
{
Console .WriteLine (MacComputer...);
return new Computer(ram, this );
}
}
public abstract class abstractFactory
{
public abstract RAM CreateRam();
public abstract CPU CreateCpu() ;
}
public class PcFactory:abstractFactory
{
public override RAM CreateRam()
{
return new pcRAM();
}
public override CPU CreateCpu()
{
return new pcCPU();
}
}
public class MacFactory:abstractFactory
{
public override RAM CreateRam()
{
return new macRAM();
}
public override CPU CreateCpu()
{
return new macCPU();
}
}
class ITMarket
{
private RAM ram;
private CPU cpu;
public ITMarket(abstractFactory factory)
{
this .ram = factory.CreateRam();
this .cpu = factory.CreateCpu();
}
public void Run()
{
ram.ComposeAComputer(cpu);
cpu.ComposeAComputer(ram);
}
}
class ClientApp
{
public static void Main( string [] args)
{
Console .WriteLine(PC Factory..... );
abstractFactory pcfactory = new PcFactory ();
ITMarket itMarket = new ITMarket (pcfactory);
itMarket .Run ();
Console .WriteLine(MAC Factory..... );
abstractFactory macfactory = new MacFactory();
itMarket = new ITMarket (macfactory);
itMarket .Run ();
}
}
}