大话设计模式(1)简单工厂模式

时间:2021-01-14 20:28:35

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。

 

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

 

请看UML图:
大话设计模式(1)简单工厂模式
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
 
该模式中包含的角色及其职责
 
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
 
抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
 
具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
 
详细代码:
 
工厂类
/**
 * 
 * @author zyh
 * 
 */
public class Test {
    public static void main(String[] args) {
        Product product = ProductFactory.createProduct(ProductType.PRODUCTA);
        String productA = product.createRealProduct();
        System.out.println(productA);

        product = ProductFactory.createProduct(ProductType.PRODUCTB);
        String productB = product.createRealProduct();
        System.out.println(productB);
    }
}

 

抽象产品类

public class Product {
    /**
     * 创建产品
     * 
     * @return
     */
    public String createRealProduct() {
        String product = "";
        return product;
    }
}

 

具体产品类

/**
 * 产品A
 * 
 * @author zyh
 * 
 */
public class ProductA extends Product {

    @Override
    public String createRealProduct() {
        String productA = "产品A";
        return productA;
    }

}
/**
 * 产品B
 * 
 * @author zyh
 * 
 */
public class ProductB extends Product {

    @Override
    public String createRealProduct() {
        String productB = "产品B";
        return productB;
    }

}

 

其他:产品的类型

/**
 * 产品A,产品B的类型
 * 
 * @author zyh
 * 
 */
public enum ProductType {
    PRODUCTA, PRODUCTB
}

 

最后来个测试类,测试ok

/**
 * 
 * @author zyh
 * 
 */
public class Test {
    public static void main(String[] args) {
        Product product = ProductFactory.createProduct(ProductType.PRODUCTA);
        String productA = product.createRealProduct();
        System.out.println(productA);

        product = ProductFactory.createProduct(ProductType.PRODUCTB);
        String productB = product.createRealProduct();
        System.out.println(productB);
    }
}

 

输出:

产品A
产品B

 

资料来源:

[1] 百度-简单工厂模式

[2] 豆瓣-大话设计模式

[3] clarcks的 github 代码