Abstract Factory笔记
new 的问题:
实现依赖,不能应对“具体实例化类型”的变化。
解决思路:
封装变化点 — 哪里变化,封装哪里。
潜台词:如果没有变化,当然不需要额外的封装。
简单工厂的问题:
不能应对“不同系列对象”的变化。
如何解决:
使用面向对象的技术来“封装”变化点。
Abstract Factory动机:
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在更多系列对象的创建工作。
如果只有一个系列,是不需要重用 Abstract Factory 的。简单工作就可以了。简单工厂可以应对一个系列对象的变化。
GOF解释:
提供一个接口 ,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。
要点:
1. 如果没有应对“多个系列对象创建”的需求变化,没有必要使用Abstract Factory,对于单个系列对象创建,可以使用简单的静态工厂模式。
2. Abstract Factory 主要应对于新的系列的需求变动,其缺点在于难于应对新的对象的需求变动。
3. Abstract Factory 经常和Factory Mothod组合起来来应对“对象创建”的需求变化。
class Program
{
static void Main(string[] args)
{
GameManager g = new GameManager();
g.BuildGameFacilities();
g.Run();
}
}
public abstract class Road
{
}
public abstract class Building
{
}
public abstract class Tunnel
{
}
public abstract class Jungle
{
}
public class ModernRoad : Road
{
}
public class ModernBuilding : Building
{
}
public class ModernTunnel : Tunnel
{
}
public class ModernJungle : Jungle
{
}
abstract class FacilitiesFactory
{
public abstract Road CreateRoad();
public abstract Building CreateBuilding();
public abstract Tunnel CreateTunnel();
public abstract Jungle CreateJungle();
}
//Clint Program
class GameManager
{
FacilitiesFactory facilitiesFactory;
Road road;
Building building;
Tunnel tunnel;
Jungle jungle;
public GameManager(FacilitiesFactory facilitiesfactory)
{
this.facilitiesFactory = facilitiesFactory;
}
public void BuildGameFacilities()
{
road = facilitiesFactory.CreateRoad();
building = facilitiesFactory.CreateBuilding();
tunnel = facilitiesFactory.CreateTunnel();
jungle = facilitiesFactory.CreateJungle();
}
public void Play()
{
road.AAA();
building.BBB(road);
tunnel.CCC();
}
}