zoukankan      html  css  js  c++  java
  • 简单工厂模式

    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();
    //			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;
    	}
    }
    
    

    负责创建对象的工厂,通过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

  • 相关阅读:
    菜鸟二三事
    访问 IIS 元数据库失败的问题(转)
    SQL Server 2005/2008还原数据库时遇到的问题(转)
    ME54N审批、撤批触发增强点:ME_RE…
    南通网站建设整理:最新搜索引擎登录口保证都可以用
    调试mvc的源代码
    c#委托(delegate)揭秘
    ASP.NET 应用程序生命周期概述
    JavaScript Array(数组)对象
    jQuery.each
  • 原文地址:https://www.cnblogs.com/mingmingcome/p/9513238.html
Copyright © 2011-2022 走看看