问题的提出:
new 的问题
常规的对象创建方法
Road road = new Road();
实现依赖,不能应对“具体实例化类型”的变化
解决思路
封装变化点:哪里变化,封装哪里;不是变化就不要封装。
面向接口编程,依赖接口,而非依赖实现
简单的实现方式:
//Road为抽象类,返回的是具体的类
class RoadFactory
{
public Static Road CreateRoad()
{
return new ConCreaRoad();
}
}
Road road = RoadFactory.CreateRoad();
1、动机
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作,同时,由于需求的变化,往往存在着更多系列对象的创建工作。
如何应对这种变化?如何绕过对象创建的方法new,提供一种封装机制来避免客户程序和这种“多系列具体对象创建工作的”紧耦合。
2、意图
提供一个接口,让该接口负责创建“一系列相关或者相互依赖的对象”,无需指定它们具体的类。
3、图
A1和B1是相同风格的。
A2和B2是相同风格的。
A1和B1相互依赖
A2和B2相互依赖。
A1和B1是1系列的。
A2和B2是2系列的。
客户程序只需依赖AbstractFactory、AbstractProductA、AbstractProductB。
4、代码实现
抽象工厂类
publict interface Creator
{
public ProductA factoryA();
public ProductB factoryB();
}
抽象产品类
public interface ProductA
{
}
public interface ProductB
{
}
具体产品类
public class ProductA1 : ProductA
{
public ProductA1 (){...}
}
public class ProductA2 : ProductA
{
public ProductA2 (){...}
}
public class ProductB1 : ProductB
{
public ProductB1 (){...}
}
public class ProductB2 : ProductB
{
public ProductB2 (){...}
}
具体工厂类
public class ConcreteCreator1 : Creator
{
public ProductA factoryA()
{
return new ProductA1 ();
}
public ProductB factoryB()
{
return new ProductB1 ();
}
}
public class ConcreteCreator2 : Creator
{
public ProductA factoryA()
{
return new ProductA2 ();
}
public ProductB factoryB()
{
return new ProductB2 ();
}
}
//客户程序
//增加新的系列时Manage是不需要动的
pulic class Manager
{
public Manager(Creator creator )
{
ProductA product1= creator.factoryA();
ProductB product2= creator.factoryB();
}
}
public class Test
{
public static void Main()
{
Manager tempManage = new Manager();
tempManage (new ConcreteCreator1());//只需要修改这里就可以了。
}
}
5、几个要点
(1). 如果没有应对“多系列对象创建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的静态工厂就可以了。
(2). 系列对象指的是这些对象之间有相互依赖。
(3). Abstract Factory模式应对“新系列”的需求变动,难以应对“新对象”的需求变动。
(4). Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。
6、应用
比如给不同样式的外观就可以使用。