工厂模式
概述
- 分类
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 作用
- 将对象的创建与使用分离
简单工厂模式
- 概述:提供工厂类用于对象创建,将对象的创建与使用分离1
- 组成:
- creator:工厂角色,主要职责是根据需求创建具体产品对象
- productor:抽象角色,产品对象的抽象父类
- concrete-productor:具体产品角色
- 优势:
- 业务分离:将对象的创建(生产者)与对象使用(消费者)分离
- 对象黑盒:调用方无需关注生成的具体的产品角色
- 劣势:
- 将对象创建工作放置在一个类中,扩展性受到限制,增加新的产品类型必然要修改工程类,违反开闭原则
- 示例2
-
功能描述:两个数的加减乘除运算及结果输出
-
抽象角色
/** * 基础运算对象 * 1.定义运算参数 * 2.定义抽象方法 */ public abstract class BaseOperation { private Integer numberA ; private Integer numberB ; /** * 具体运算规则交由子类实现 */ public abstract void operation(); public Integer getNumberA() { return numberA; } public void setNumberA(Integer numberA) { this.numberA = numberA; } public Integer getNumberB() { return numberB; } public void setNumberB(Integer numberB) { this.numberB = numberB; } }
-
具体角色
/** * 加法运算 */ public class AddOperation extends BaseOperation { @Override public void operation() { Integer result = getNumberA() + getNumberB() ; System.out.println(result); } }
/** * 减法运算 */ public class SubOperation extends BaseOperation { @Override public void operation() { Integer result = getNumberA() - getNumberB() ; System.out.println(result); } }
/** * 乘法运算 */ public class MulOperation extends BaseOperation { @Override public void operation() { Integer result = getNumberA() * getNumberB(); System.out.println(result); } }
/** * 除法运算 */ public class DivOperation extends BaseOperation { @Override public void operation() { if(getNumberB() != 0){ System.out.println(getNumberA() / getNumberB()); } } }
-
工厂角色
/** * 简单工厂模式工厂类 * 负责根据业务需求创建具体的产品角色 */ public class SimpleFactoryModelFactory { /** * 适用场景: * 业务逻辑稳定且较长时间内不会变更 * * 模式劣势: * 产品角色扩充需要修改工厂类,违反开闭原则 * * @param operationFlag * @return */ public static BaseOperation createOperation(char operationFlag){ /** * 此处极容易出错,需要调用方与提供方严格约束入参类型及内容 */ switch (operationFlag){ case '+' : return new AddOperation(); case '-' : return new SubOperation(); case '*' : return new MulOperation(); case '/' : return new DivOperation(); default:return new AddOperation(); } } }
-
对象使用
/** * 简单工厂方法测试类 */ public class SimpleFactoryModelTest { public static void main(String[] args) { BaseOperation operation = SimpleFactoryModelFactory.createOperation('+'); operation.setNumberA(1); operation.setNumberB(1); operation.operation();// 2 } }
-
工厂方法模式3
- 概述:简单工厂模式的延伸,弥补简单工厂模式的不足
- 组成:
- Creator:工厂角色
- Productor:抽象角色
- Concrete-productor:具体产品角色
- 优势:相比于简单工厂模式,避免了因传入字符错误而导致模型创建失败
- 劣势:新增新的模型依然需要修改工厂方法,违反开闭原则
- 示例:
-
工厂方法模式
/** * 工厂方法模式 * 与简单工厂模式相比,可以避免因传入字符不匹配而导致对象创建错误 */ public class FactoryMethodModelFactory { public static BaseOperation createAddOperation(){ return new AddOperation(); } public static BaseOperation createSubOperation(){ return new SubOperation(); } public static BaseOperation createMulOperation(){ return new MulOperation(); } public static BaseOperation createDivOperation(){ return new DivOperation(); } }
-
工厂方法模式单元测试
/** * 工厂方法模式测试类 */ public class FactoryMethodModelTest { public static void main(String[] args) { BaseOperation baseOperation = FactoryMethodModelFactory.createAddOperation(); baseOperation.setNumberA(1); baseOperation.setNumberB(2); baseOperation.operation(); } }
-
抽象工厂模式4
- 概述:抽象工厂方法是工厂方法模式的延伸,它提供了功能更为强大的工厂类并且具备较好的可扩展性
- 组成:
- abstract-creator:抽象工厂角色,定义需要子类继承实现的方法
- productor:抽象角色
- concrete-productor:具体产品角色
- concrete-creator:具体工厂角色,根据需求定义多个子类
- 优势:方便增加同类模型对象,扩展性强
- 劣势:产品模型结构扩充困难,需要从抽象对象开始进行修改
- 示例
- 抽象工厂
/** * 抽象工厂模式 */ public interface OperationFactory { BaseOperation createOperation(); }
- 工厂实例
/** * 加法操作工厂 */ public class AddOperationFactory implements OperationFactory { public BaseOperation createOperation() { return new AddOperation(); } }
- 抽象工程单元测试类
/** * 抽象工厂模式 */ public class AbstractFactoryModelTest { public static void main(String[] args) { OperationFactory operationFactory = new AddOperationFactory(); BaseOperation operation = operationFactory.createOperation(); operation.setNumberB(1); operation.setNumberA(2); operation.operation(); } }
- 抽象工厂