当直接实例化处在同一包结构中、实现统一接口的多个类。可以把类的构造函数声明为非公共的,并通过Factory来创建它们的实例
(针对多个类:把多个类的构造方法先creation method,之后提取到工厂类中)
public abstract class AttributeDescriptor { protected AttributeDescriptor() { } public void sayHello() { }}public class IntegerDescriptor extends AttributeDescriptor { public IntegerDescriptor() { super(); } public void sayHello() { System.out.println("I am integer method"); }}public class BooleanDescriptor extends AttributeDescriptor { public BooleanDescriptor() { super(); } public void sayHello() { System.out.println("I am boolean method"); }}public class ReferenceDescriptor extends AttributeDescriptor { public ReferenceDescriptor() { super(); } public void sayHello() { System.out.println("I am reference method"); }}
重构之后:
public abstract class AttributeDescriptor { protected AttributeDescriptor(){ } public void sayHello(){ } public AttributeDescriptor forInteger(){ return new IntegerDescriptor(); } public AttributeDescriptor forBoolean(){ return new BooleanDescriptor(); } public AttributeDescriptor forReference(){ return new ReferenceDescriptor(); }}public class IntegerDescriptor extends AttributeDescriptor{ public void sayHello(){ System.out.println("I am integer method"); }}public class BooleanDescriptor extends AttributeDescriptor{ public void sayHello(){ System.out.println("I am boolean method"); }}public class ReferenceDescriptor extends AttributeDescriptor{ public void sayHello(){ System.out.println("I am reference method"); }}
AttributeDescriptor a = AttributeDescriptor.forInteger(); a.sayHello();
动机:
可以通过Factory将一组客户并不需关心的子类屏蔽到包内部。
如果类共享一个通用的公共接口、共享相同的超类、并且处在同一包结构中,该重构可能有用。
优缺点:
+ 通过意图导向的Creation Method简化了不同种类实例的创建
+ 通过隐藏不需要公开的类减少了包的“概念重量”
+ 帮助严格执行“面向接口编程,而不是面向实现”这一格言
- 当需要创建新种类的实例时,必须更新Creation Method
- 当客户只能获得Factory的二进制代码而无法获得源码时,对Factory的定制将受到限制