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

  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设计模式》

猜你喜欢

转载自blog.csdn.net/ifwinds/article/details/69788962