码迷,mamicode.com
首页 > 其他好文 > 详细

简单工厂模式

时间:2015-11-17 19:37:01      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

模式定义

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

模式结构

1.Factory:工厂角色

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

2.Product:抽象产品角色

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

3.ConcreteProduct:具体产品角色

具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例

实例

背景:通过一个简单的计算器<加减乘除>来说明这个模式

1.创建一个工厂,这个类主要是通过传进去的运算符来生成对应的运算类

public class OperationFactory {
    public static Operation createOperation (String operate) {
        Operation operation = null;
        switch(operate) {
        case "+":
            operation = new OperationAdd();
            break;
        case "-":
            operation = new OperationSubtract();
            break;
        case "*":
            operation = new OperationMultiply();
            break;
        case "/":
            operation = new OperationDivide();
            break;
        }
        return operation;
    }
}

2.定义抽象出来的运算接口

public interface Operation {
    //获取两位数计算的结果
    public int getResult(int numberOne,int numberTwo);
}

3.每个运算类分别去实现Operation 接口

/**
 * 加法运算
 * @author shengfenglai
 */
public class OperationAdd implements Operation {
    @Override
    public int getResult(int numberOne, int numberTwo) {
        return numberOne + numberTwo;
    }
}
/**
 * 减法运算
 * @author shengfenglai
 */
public class OperationSubtract implements Operation {
    @Override
    public int getResult(int numberOne, int numberTwo) {
        return numberOne - numberTwo;
    }
}
/**
 * 乘法运算
 * @author shengfenglai
 */
public class OperationMultiply implements Operation {
    @Override
    public int getResult(int numberOne, int numberTwo) {
        return numberOne * numberTwo;
    }
}
/**
 * 除法运算
 * @author shengfenglai
 */
public class OperationDivide implements Operation {
    @Override
    public int getResult(int numberOne, int numberTwo) {
        int result = 0;
        if(numberTwo != 0) {
            result = numberOne / numberTwo;
        }else {
            throw new NotBeZeroException("除数不能为0");
        } 
        return result;
    }
}

4.自定义一个异常,用来除数为0的时候抛出

public class NotBeZeroException extends RuntimeException {
    /**
     * 
     */
    private static final long serialVersionUID = 9056463784173674087L;
    public NotBeZeroException(String msg) {
        super(msg);
    }
}

5.测试类

public class OperationTest {
    public static void main(String[] args) {
        //test for add 
        Operation addOperation = OperationFactory.createOperation("+");
        int addResult = addOperation.getResult(1,2);
        System.out.println("1 + 2 = " + addResult);
        //test for subtract
        Operation subtractOperation = OperationFactory.createOperation("-");
        int subtractResult = subtractOperation.getResult(9,5);
        System.out.println("9 - 5 = " + subtractResult);
        //test for  multiply
        Operation multiplyOperation = OperationFactory.createOperation("*");
        int multiplyResult = multiplyOperation.getResult(4,6);
        System.out.println("4 * 6 = " + multiplyResult);
        // test for divide
        Operation divideOperation = OperationFactory.createOperation("/");
        int divideResult = divideOperation.getResult(8,4);
        //int divideResult = divideOperation.getResult(8,0);
        System.out.println("8 / 4 = " + divideResult);
    }
}

模式优点

模式的核心是工厂类,该类中含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。简单工厂模式实现了对责任的分割。



模式缺点

1.工厂类用静态方法作为工厂类,这样就没办法由子类继承,所以没办法形成继承的等级结构

2.将多个创建逻辑放在一个类中,当产品类有不同接口种类时,工厂类需要判断在什么时候创建某种产品,使得系统在将来进行功能扩展时较为困难。就是if else 会越来越多,不利于维护

3.只适用于工厂类负责创建的对象比较少时


简单工厂模式

标签:

原文地址:http://my.oschina.net/lsf930709/blog/531672

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!