设计模式之----简单工厂模式

  设计模式原则是“针对接口编程,而不是对实现编程”;

  简单工厂模式根据提供给它的数据,返回一个类的实例。通常它返回的类都是一个公共的父类或者接口对象。

简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。简单工厂实例化的类具有相同的接口或基类,在子类比较固定并不需要扩展时,可以使用简单工厂。

  优点:可以使用户根据参数获得相应的类实例,避免了直接实例化类,降低了耦合性;

  缺点:实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工作,不符合OCP开闭原则。

  简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不合适使用。

 

  公共的父类或者接口对象

/**
 * 设计一个计算器
 * 
 * @author foolishbird_lmy
 * 
 */
class Operation {
    /*
     * 数据操作类,用于封装数据
     */
    public double num1;
    public double num2;

    public double getNum1() {
        return num1;
    }

    public void setNum1(double num1) {
        this.num1 = num1;
    }

    public double getNum2() {
        return num2;
    }

    public void setNum2(double num2) {
        this.num2 = num2;
    }
    //定义一个抽取的共同的结果方法
    public double getResult() throws OperationDivImp {
        return 0;
    }
}

下面这些类继承了父类或者去实现上面的接口,重写或者实现里面抽取的方法,例如 getResult()

//加法操作,继承封装数据类,用来操作数据
class OperationAdd extends Operation {
    //重写抽取的方法
    public double getResult() {
        return num1 + num2;
    }
}
//减法操作,继承封装数据类,用来操作数据
class OperationSub extends Operation {
    public double getResult() {
        return num1 - num2;
    }
}
//乘法操作,继承封装数据类,用来操作数据
class OperationMul extends Operation {
    public double getResult() {
        return num1 * num2;
    }
}

class OperationDivImp extends Exception {
    /**
     * 自定义异常类,用来处理除法中除数是0的情况
     */
    private static final long serialVersionUID = 1L;

    public OperationDivImp(String msg) {
        super(msg);
    }
}
//除法操作,继承封装数据类,用来操作数据
class OperationDiv extends Operation {
    public double getResult() throws OperationDivImp {
        if (num2 == 0) {
            throw new OperationDivImp("除数不能为0");
        }
        return num1/num2;
    }
}

客户端,创建工厂实例,根据需要建立相对应的实现类型

//工厂类
class OperationFactory{
    public static Operation createOperate(String operate){
        Operation operation = null;
        switch (operate) {
        case "+":
            operation = new OperationAdd();
            break;
        case "-":
            operation = new OperationSub();
            break;
        case "*":
            operation = new OperationMul();
            break;
        case "/":
            operation = new OperationDiv();
            break;
        default:
            System.out.println("运算符号异常");
            break;
        }
        return operation;
    }
}

相应实现测试

public class 简单工厂模式 {
    public static void main(String[] args) throws OperationDivImp{
        Operation oper = OperationFactory.createOperate("/");
        oper.num1 = -1;
        oper.num2 = -8;
        double result = oper.getResult();
        System.out.println(result);
    }
}

 

posted @ 2016-04-28 16:55  CfoolishbirdC  阅读(479)  评论(0编辑  收藏  举报