简单工厂模式
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 阅读(...) 评论(...) 编辑 收藏