工厂方法模式(Factory Method)

172 阅读2分钟

在Factory Method模式中,父类决定实例的生成方式,但比不决定所要生成的具体的类,具体的处理全部交给子类去处理。这样就可以生成实例的框架(framework)和负责生产实例的类解耦

UML箭头表示方法

工厂方法的类图:

说明:
  • Creator(创建者)属于框架这一方,负责生成Product的抽象类
  • Product(产品)属于框架这一方,它定义了工厂方法模式中生成的那些实例所持有的接口(API)
  • ConcreteCreator和ConcreteProduct分别是具体的创建者和具体的产品

来一段代码:

这是一个关于制作身份证的小demo

  • Factory和Product类属于framework包,这两个类是用于组成实例的框架
  • IDCardFactory和IDCard两个类负责加工处理,属于idcard包
  • 类图:
package designPattern.factory.factoryMethod.framework;

/**
 * 创建者,交给子类去完成
 */
public abstract class Factory {
    public final Product create(String owner){
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
    }
    protected abstract Product createProduct(String owner);
    protected abstract void registerProduct(Product product);

}
package designPattern.factory.factoryMethod.framework;

/**
 * 产品,它定义的是Factory Method模式中生成的实例所持有的接口
 */
public abstract class Product {
    public abstract void use();
}
package designPattern.factory.factoryMethod.idcard;

import designPattern.factory.factoryMethod.framework.Factory;
import designPattern.factory.factoryMethod.framework.Product;

import java.util.ArrayList;
import java.util.List;

/**
 * 属于具体加工的这一方,它负责生成具体的产品
 */
public class IDCardFactory extends Factory {
    private List owners = new ArrayList();

    @Override
    protected Product createProduct(String owner) {
        return new IDCard(owner);
    }

    @Override
    protected void registerProduct(Product product) {
        owners.add(((IDCard)product).getOwner());
    }

    public List getOwners(){
        return owners;
    }
}
package designPattern.factory.factoryMethod.idcard;

import designPattern.factory.factoryMethod.framework.Product;

/**
 * 属于具体的加工这一方,它决定了具体的产品
 */
public class IDCard extends Product {
    private String owner;

    /**
     * 创建一个构造函数
     * @param owner
     */
    public IDCard(String owner) {
        System.out.println("制作" + owner + "的ID卡");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println("使用" + owner + "的ID卡");
    }

    public String getOwner(){
        return owner;
    }
}

测试:

package designPattern.factory.factoryMethod;

import designPattern.factory.factoryMethod.framework.Factory;
import designPattern.factory.factoryMethod.framework.Product;
import designPattern.factory.factoryMethod.idcard.IDCardFactory;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        Factory factory = new IDCardFactory();

        Product card1 = factory.create("Mike");
        Product card2 = factory.create("Joe");
        card1.use();
        card2.use();
    }
}
/**
 * 打印的结果
 * 制作Mike的ID卡
 * 制作Joe的ID卡
 * 使用Mike的ID卡
 * 使用Joe的ID卡
 */