天天看点

设计模式之工厂方法模式及代码示例

  1. 为什么使用工厂方法

    一般创建对象的方式是new关键字来生成,但是这种方式必然地使得客户端程序员的代码和我们的对象产生了过于紧密的耦合,为了解除这样的耦合状态,提高客户端代码灵活性和可扩展性,使用工厂方法模式。

  2. 工厂方法模式

    客户端代码为了获得对象,通过工厂对象生成,客户端代码只需要给工厂实例发送创建对象的消息即可。

    1. 代码示例

      现在我有如下的接口和类

      接口: Product 所有产品类都需要实现这个接口

      类:ProductA、ProductB、ProductFactory、FactoryTest类

      枚举:EnumProductType

/***
 * 接口类,作为产品类的接口
 * @author yjzhou
 * 2016.03.17
 */
public interface Product {
    public void printName();
}
           
/***
 * A类型的产品
 * @author yjzhou2
 * 2016.03.17
 */
public class ProductA implements Product {
    // 产品名称
    private String productName;

    public ProductA() {
        this.productName = "defaut name A";
    }

    public ProductA(final String productName) {
        this.productName = productName;
    }

    @Override
    public void printName() {
        System.out.println(productName);
    }

}
           
/***
 * B类型的产品
 * @author yjzhou2
 * 2016.03.17
 */
public class ProductB implements Product {
    // 产品名称
    private String productName;

    public ProductB() {
        this.productName = "defaut name B";
    }

    public ProductB(final String productName) {
        this.productName = productName;
    }

    @Override
    public void printName() {
        System.out.println(productName);
    }

}
           
/**
 * 枚举类,列举产品类型
 * @author yjzhou
 * 2016.03.17
 */
public enum EnumProductType {
    //产品类型 A
    TYPE_A,
    //产品类型B
    TYPE_B;
}
           
/**
 * 生产产品的工厂
 * @author yjzhou
 * 2016.03.17
 */
public class ProductFactory {

    //用于存储产品
    private Product product;

    /**
     * 获取相应类型的产品
     * @param type 需要获取的产品的类型
     * @return 产品的实例对象
     */
    public Product getProduct(final EnumProductType type){
        createProduct(type);
        return product;
    }

    /**
     * 创建产品实例
     * @param type 需要创建的类型
     */
    private void createProduct(final EnumProductType type){
        switch (type) {
        case TYPE_A:{
            product = new ProductA("你好,我是A类产品!");
            break;
        }
        case TYPE_B:{
            product = new ProductB("你好,我是B类产品!");
        }
        default:
            product = null;
            break;
        }
    }
}
           

“`

public class FactoryTest {

public static void main(String[] args) {
    //获取工厂实例
    ProductFactory factory = new ProductFactory();
    //获取指定类型产品
    Product product = factory.getProduct(EnumProductType.TYPE_A);
    //输出产品信息
    product.printName();
}
           

}

总结

优点:

通过代码示例,我们可以看到,客户端代码需要得到产品对象时,通过工厂生成,而不必主动通过new关键字生成了,程序的可扩展增加了。

缺点:

虽然客户端代码和产品对象的创建解耦了,但是和工厂对象形成了耦合,并且如果产品新增了类型,还是需要修改工厂方法的分支判断。

`

继续阅读