namespace AbstractFactroy
{
/*
* 应对多系列对象构建的需求变化 时 使用AbstractFactory
* 对象稳定不变(不会经常修改),变的是对象的系列(风格)
* “系列对象”指的是这些对象之间有相互依赖、或作用关系。
*/
#region 抽象工厂
//道路
public abstract class Road
{
public abstract void A();
}
//房屋
public abstract class Building
{
public abstract void B(Road road);
}
//地道
public abstract class Tunnel
{
public abstract void C();
}
//树林
public abstract class Jungle
{
public abstract void D(Tunnel tunnel);
}
public abstract class FaciltiesFactroy
{
public abstract Road CreateRoad();
public abstract Building CreateBuilding();
public abstract Tunnel CreateTunnel();
public abstract Jungle CreateJungle();
}
#endregion
#region 具体的实现===(现代风格的系列)=================================
//道路
public class ModernRoad:Road
{
public override void A()
{
Console.WriteLine("现代风格的Road");
}
}
//房屋
public class ModernBuilding:Building
{
public override void B(Road road)
{
Console.WriteLine("现代风格的Building 和 "+road.ToString());}
}
//地道
public class ModernTunnel:Tunnel
{
public override void C()
{
Console.WriteLine("现代风格的Tunnel");}
}
//树林
public class ModernJungle:Jungle
{
public override void D(Tunnel tunnel)
{
Console.WriteLine("现代风格的Jungle 和 "+tunnel.ToString());
}
}
//现代场景的饰面工厂
public class ModernFaciltiesFactroy : FaciltiesFactroy
{
public override Road CreateRoad()
{
return new ModernRoad();
}
public override Building CreateBuilding()
{
return new ModernBuilding();
}
public override Tunnel CreateTunnel()
{
return new ModernTunnel();
}
public override Jungle CreateJungle()
{
return new ModernJungle();
}
}
#endregion
#region 具体的实现===(古典风格的系列)=================================
//道路
public class ClassicRoad : Road
{
public override void A()
{
Console.WriteLine("古典风格的Road");
}
}
//房屋
public class ClassicBuilding : Building
{
public override void B(Road road)
{
Console.WriteLine("古典风格的Building 和 " + road.ToString());
}
}
//地道
public class ClassicTunnel : Tunnel
{
public override void C()
{
Console.WriteLine("古典风格的Tunnel");
}
}
//树林
public class ClassicJungle : Jungle
{
public override void D(Tunnel tunnel)
{
Console.WriteLine("古典风格的Jungle 和 " + tunnel.ToString());
}
}
//古典场景的饰面工厂
public class ClassicFaciltiesFactroy : FaciltiesFactroy
{
public override Road CreateRoad()
{
return new ClassicRoad();
}
public override Building CreateBuilding()
{
return new ClassicBuilding();
}
public override Tunnel CreateTunnel()
{
return new ClassicTunnel();
}
public override Jungle CreateJungle()
{
return new ClassicJungle();
}
}
#endregion
//Client====客户程序=============================================
class GameManager
{
FaciltiesFactroy faciltiesFactroy;
Road road;
Building building;
Tunnel tunnel;
Jungle jungle;
public GameManager(FaciltiesFactroy faciltiesFactroy)
{
this.faciltiesFactroy = faciltiesFactroy;
}
public void BuildGameFacilties()
{
road = faciltiesFactroy.CreateRoad();
building = faciltiesFactroy.CreateBuilding();
tunnel = faciltiesFactroy.CreateTunnel();
jungle = faciltiesFactroy.CreateJungle();
}
public void Run()
{
road.A();
building.B(road);
tunnel.C();
jungle.D(tunnel);
}
}
class app
{
static void Main()
{
//创建现代饰面
GameManager g = new GameManager(new ModernFaciltiesFactroy());
g.BuildGameFacilties();
g.Run();
//创建古典饰面
GameManager f = new GameManager(new ClassicFaciltiesFactroy());
f.BuildGameFacilties();
f.Run();
Console.ReadLine();
}
}
}