【重构与模式】6.3 用Factory封装类

  当直接实例化处在同一包结构中、实现统一接口的多个类。可以把类的构造函数声明为非公共的,并通过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的定制将受到限制



你可能感兴趣的:(factory,Refactoring,重构与模式)