简单工厂模式

时间:2024-01-21 09:29:08

简单工厂模式

begin 2018年8月19日19:44:25

简单工厂模式

定义

只要你说的,只要我有,我都给你。

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

角色

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

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

具体产品角色(ConcreteProduct):最终被创建的对象

类图

简单工厂模式

时序图

简单工厂模式
(不知道画的对不对)

代码示例

抽象产品角色(IOperation.java):

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: IOperation
 * @Description: 运算操作接口
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:43:14
 */
public interface IOperation {
    public int getResult(int a, int b);
}

简单工厂模式所创建的实例的公共接口:运算操作接口。

具体产品角色(AddOperationImpl.java、SubOperationImpl.java、MulOperationImpl.java、DivOperationImpl.java):

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: AddOperationImpl
 * @Description: 加运算实现类
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:46:25
 */
public class AddOperationImpl implements IOperation{

    @Override
    public int getResult(int a, int b) {
        return a + b;
    }

}

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: SubOperationImpl
 * @Description: 减运算实现类
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:48:55
 */
public class SubOperationImpl implements IOperation {
    
    @Override
    public int getResult(int a, int b) {
        return a - b;
    }
}

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: MulOperationImpl
 * @Description: 乘运算实现类
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:52:04
 */
public class MulOperationImpl implements IOperation {

    @Override
    public int getResult(int a, int b) {
        return a * b;
    }

}

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: DivOperationImpl
 * @Description: 减运算实现类
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:52:48
 */
public class DivOperationImpl implements IOperation {

    @Override
    public int getResult(int a, int b) {
        return a / b;
    }

}

被创建的具体对象:加减乘除运算操作。

工厂角色(SimpleFactory.java):

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: SimpleFactory
 * @Description: 简单工厂类
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:54:20
 */
public class SimpleFactory {

    public static IOperation createOperation(String op) {
        IOperation operation = null;
        // 1、适用范围有限:byte、short、char、int及其包装类,还有Enum、String
//      switch(op){
//      case "+":
//          operation = new AddOperationImpl();
//      case "-":
//          operation = new SubOperationImpl();
//      case "*":
//          operation = new MulOperationImpl();
//      case "/":
//          operation = new DivOperationImpl();
//      }
        
        // 2、所有对象
        if ("+".equals(op)) {
            operation = new AddOperationImpl();
        } else if ("-".equals(op)) {
            operation = new SubOperationImpl();
        } else if ("*".equals(op)) {
            operation = new MulOperationImpl();
        } else if ("/".equals(op)) {
            operation = new DivOperationImpl();
        }
        
        return operation;
    }
}

负责创建对象的工厂,通过String类型的“+”、“-”、“*”、“”来区分实例化哪个对象,这个判断标志你可以设置为你想的任何东西,中文的“加”、“减”、“乘”、“除”也是可以的。

测试类(SimpleFactoryTest.java):

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: SimpleFactoryTest
 * @Description: 简单工厂模式测试类
 * @author: luhaoming
 * @date: 2018年8月19日 下午5:05:36
 */
public class SimpleFactoryTest {
    
    public static void main(String[] args) {
        int a = 999, b = 888;
        // 加
        IOperation operation = SimpleFactory.createOperation("+");
        int add = operation.getResult(a, b);
        System.out.println("a '+' b:" + add);
        // 减
        operation = SimpleFactory.createOperation("-");
        operation.getResult(a, b);
        int sub = operation.getResult(a, b);
        System.out.println("a '-' b:" + sub);
        // 乘
        operation = SimpleFactory.createOperation("*");
        operation.getResult(a, b);
        int mul = operation.getResult(a, b);
        System.out.println("a '*' b:" + mul);
        // 除
        operation = SimpleFactory.createOperation("/");
        operation.getResult(a, b);
        int div = operation.getResult(a, b);
        System.out.println("a '/' b:" + div);
    }
}

优点

1、工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过实现了对责任的分割,它提供了专门的工厂类用于创建对象。

2、客户端无须知道所创建的具体产品类的类名,只需要知道产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。本文中客户端只需要记住“+”、“—”、“*”、“/”就行了。

3、通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。(本文未实现此优点,挖坑)

缺点

1、由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

2、使用简单工厂模式将会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。

3、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多是,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

4、简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

使用场景

工厂类负责创建的对象比较少。

总结

简单工厂模式:客户端不需要知道具体创建什么对象,只需要知道参数即可。工厂类负责逻辑判断创建具体对象,具体产品对象包含着具体实现逻辑。抽象产品类为具体产品对象类提供同一接口。

参考:

简单工厂模式( Simple Factory Pattern )

2018年8月21日18:36:51

posted on 2018-08-21 18:50 mingmingcome 阅读(...) 评论(...) 编辑 收藏