创造者原则(Creator Principle)
(1)问题
谁应该负责产生类的实例?
(2)方案
如果符合下面的一个或者多个条件,则可将创建类A实例的职责分配给类B:
- B包含A;
- B聚合A;
- B拥有初始化A的数据并在创建类A的实例时将数据传递给类A;
- B记录A的实例;
- B频繁使用A。
此时,我们称类B是类A对象的创建者。如果符合多个条件,类B聚合或者包含类A的条件优先。
(3)分析
创建对象是面向对象系统中最普遍的活动之一,因此,确定一个分配创建对象的通用职责非常重要。如果职责分配合理,设计就能降低耦合,提高设计的清晰度、封装性和重用性。通常情况下,如果对象的创建过程不是很复杂,则根据上述原则,由使用对象的类来创建对象。但是如果创建过程非常复杂,而且可能需要重复使用对象实例或者需要从外部注入一个对象实例,此时,可以委托一个专门的工厂类来辅助创建对象。创建者原则与各种工厂模式(简单工厂模式、工厂方法模式和抽象工厂模式)相对应。
示例:
public static class FruitFactory {
private Fruit _fruit = null;
public static Fruit CreateFruit(FruitType type) {
_fruit = null;
switch(type) {
case FruitType.Apple:
_fruit = new Apple();
break;
case FruitType.Orange:
_fruit = new Orange();
break;
case FruitType.Pear:
_fruit = new Pear();
break;
default:
throw new UnknowFruitException();
}
return _fruit;
}
}
注:以上为示意性代码,部分类和枚举未给出。
水果工厂FruitFactory根据参数生成水果的实例。水果工厂包含水果,水果工厂维持了水果的实例,水果工厂频繁的生成水果。