简单工厂(Simple Factory ) 模式

简单工厂(Simple Factory ) 模式

本文为转载,在原文的基础上添加了自己的理解。原文链接:简单工厂模式

前言

工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。

工厂模式包括:

简单工厂(Simple Factory ):也叫 静态工厂

工厂方法(Factory Method):也叫 多态工厂

抽象工厂(Abstract Factory)

用到工厂模式的场景:

  • NumberFormat、SimpleDateFormat
  • LoggerFactory:
  • SqlSessionFactory:MyBatisBeanFactory:Spring的BeanFactory(就是为了造出bean)

定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method) 模式。

设计模式分为创建型模式、结构型模式、行为型模式,简单工厂模式属于创建型模式。

特点:

  1. 在简单工厂模式中,可以根据参数的不同返回不同类型的实例
  2. 简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

角色

工厂角色(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.javaSubOperationImpl.javaMulOperationImpl.javaDivOperationImpl.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):负责创建对象的工厂,通过String类型的“+”、“-”、“*”、“\”来区分实例化哪个对象,这个判断标志你可以设置为你想的任何东西,中文的“加”、“减”、“乘”、“除”也是可以的。

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();
//			break;
//		case "-":
//			operation = new SubOperationImpl();
//			break;
//		case "*":
//			operation = new MulOperationImpl();
//			break;
//		case "/":
//			operation = new DivOperationImpl();
//			break;
//		}
		
		// 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;
	}
}

测试类(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 )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunnyboy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值