工厂方法模式

1.定义

工厂(Factory Method)模式标准定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method 使一个类的实例化延迟到其子类.

说明:工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.”

维基百科

2.实现

2.1 定义产品

/**
 * 抽象产品(Product)角色
 */
public interface Product {

    /**
     * 获取产品类型
     * @return
     */
    String getProductType();

    /**
     * 使用产品
     */
    void useProduct();
}

2.2 定义工厂

/**
 * 抽象工厂(Creator)角色
 */
public interface Company {

    /**
     * 根据产品类型构建产品
     * @param productType   产品类型
     * @return              具体的产品实现
     */
    Product buildProduct(String productType);
}

2.3 产品的具体实现

产品A

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * ProductA具体产品(Concrete Product)角色
 */
public class ProductA implements Product {

    private static final Logger loger = LoggerFactory.getLogger(ProductA.class);

    /**
     * 产品类型
     */
    private static String productType = "A";

    @Override
    public String getProductType() {
        return productType;
    }

    @Override
    public void useProduct() {
        loger.info("使用产品B");
    }
}

产品B

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * ProductB具体产品(Concrete Product)角色
 */
public class ProductB implements Product {

    private static final Logger loger = LoggerFactory.getLogger(ProductB.class);

    /**
     * 产品类型
     */
    private static String productType = "B";

    @Override
    public String getProductType() {
        return productType;
    }

    @Override
    public void useProduct() {
        loger.info("使用产品B");
    }
}

2.4 工厂的具体实现

/**
 * 具体工厂(Concrete Creator)角色
 */
public class CompanyImpl implements Company {

    @Override
    public Product buildProduct(String productType) {
        if (productType.equals("A")) {
            return new ProductA();
        } else if (productType.equals("B")) {
            return new ProductB();
        }

        return null;
    }
}

3.工厂模式测试

/**
 * 测试使用产品
 */
public class Client {

    public static void main(String[] args) {
        Company company = new CompanyImpl();

        //根据传入的参数得到ProductA产品
        Product product = company.buildProduct("A");
        product.useProduct();

        //根据传入的参数得到ProductB产品
        product = company.buildProduct("B");
        product.useProduct();

        // [main] INFO  ProductA - 使用产品B
        // [main] INFO  ProductB - 使用产品B
    }
}

results matching ""

    No results matching ""