设计模式(四)工厂模式-工厂方法模式

时间:2022-10-02 14:19:06
  1. 概述
    对象实例化这个活动不应该总是公开进行的,初始化对象经常造成耦合问题。除了使用new操作符之外,还有更多制造对象的方法,而工厂方法模式用来处理对象的创建(事实上所有的工厂模式都是用来封装对象的创建的),并将这样的行为封装在子类中。这样客户程序中关于超类的代码就和子类对象创建代码解耦了。
  2. 定义
    工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
  3. 设计原则
    依赖倒置原则:要依赖抽象,不要依赖具体类。(这个原则听起来很像是“真对接口编程,不针对实现编程”,但这里更强调“抽象”。这个原则说明了不能让高层组件依赖底层组件,而且不管高层或底层组件,都应该依赖于抽象。)
  4. UML
    设计模式(四)工厂模式-工厂方法模式
    说明:
    1) Product是一个抽象类,所有产品都必须实现这个共同的接口,这样一来使用这些产品的类,就可以引用这个接口,而不是具体的类。
    2) Creator也是一个抽象类,它实现了所有操纵产品的方法,但不实现工厂方法。
    3) ConcreteProduct是继承自Product的一类具体产品。
    4) ConcretrCreator是继承自Creator类的一个具体的创建者,并且实现了工厂方法来创造具体的产品。

  5. 实现

/**
* 抽象类-产品
*/

public abstract class Product {

/**
* 产品描述信息
*/

private String description;

public void setDescription(String descr) {
this.description = descr;
}

public String getDescription() {
return description;
}
}
/**
* 抽象类-创建者
* 定义了一个抽象的工厂方法,让子类实现此方法制造产品。
*/

public abstract class Creator {

/**
* 抽象的工厂方法,依赖子类来处理对象的创建。
* 工厂方法必须返回一个产品。
*
* @return Product
*/

protected abstract Product factory();

/**
* 创建者通常包含依赖于抽象产品的代码,而这些抽象产品由子类制造。
*/

public void productDescription() {
Product product = factory();
System.out.println(product.getDescription());
}
}
/**
* 一类具体的产品
*/

public class ConcreteProduct extends Product {
}
/**
* 具体的产品创建者
*/

public class ConcreteCreator extends Creator {

/**
* 工厂方法用来制造产品。
*
* @return Product
*/

protected Product factory() {
Product product = new ConcreteProduct();
product.setDescription("this is a concrete product !");

return product;
}
}
/**
* 测试类-工厂方法模式
*/

public class FactoryMethodTest {
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
creator.productDescription();
}
}

运行结果:
设计模式(四)工厂模式-工厂方法模式

参考资料:
《Head First设计模式》