crazyandcoder

设计模式教程(2-简单工厂模式)

2021.07.02

简单工厂模式.png

1 定义

简单工厂模式 (Simple Factory Pattern):又称为静态工厂方法 (Static Factory Method) 模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

2 UML 类图

简单工厂模式包含如下角色:

(1)Factory:工厂角色
工厂角色负责实现创建所有实例的内部逻辑

2)Product:抽象产品角色
抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口

(3)ConcreteProduct:具体产品角色
具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

简单工厂.png

3 实现方式

3.1 抽象产品类Product

/**
 * 抽象产品
 */
public interface Product {
    void description();
}

3.2 具体产品A

public class ConcreteProductA implements Product {

    @Override
    public void description() {
        System.out.println("产品 A...");
    }
}

3.3 具体产品B

public class ConcreteProductB implements Product {

    @Override
    public void description() {
        System.out.println("产品 B...");
    }
}

3.4 工厂类

/**
 * 工厂类,生成各个具体产品
 */
public class Factory {

    /**
     * 根据相关参数生成具体的产品
     *
     * @param name
     * @return
     */
    public static Product createProduction(String name) {
        if (name.equals("a")) {
            return new ConcreteProductA();
        } else if (name.equals("b")) {
            return new ConcreteProductB();
        }
        return null;
    }
    
    
        /**
     * 根据相关参数生成具体的产品
     *
     * @param clz
     * @param <T>
     * @return
     */
    public static <T extends Product> Product createProduction(Class<T> clz) {
        try {
            Product product = (Product) Class.forName(clz.getName()).newInstance();
            return (T) product;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

测试:

public class MainTest {
    public static void main(String[] args) {
        Product producta = Factory.createProduction(ConcreteProductA.class);
        producta.description();
    }
}

4 优缺点

4.1 优点

  1. 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
  2. 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。

4.2 缺点

  1. 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
  2. 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
  3. 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
  4. 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。