设计模式-简单工厂模式

来源:互联网 发布:吴京的地位知乎 编辑:程序博客网 时间:2024/06/13 10:19

简单工厂模式的定义

简单工厂模式属于创建型设计模式,也可以叫做静态工厂模式,通过一个单独的工厂类负责对象的创建来实现 创建-使用的分离,同时,被创建的对类对象要实现相同的接口继承相同的抽象类

UML类图

以计算器Demo为例

这里写图片描述

简单工厂模式中主要包含四个角色:客户端、工厂、抽象接口、具体实现。
客户端:工厂的最终调用者。
工厂:简单工厂模式的核心,包含所有具体实现类的创建逻辑,是客户端和具体实现类的链接者。
抽象接口:可以是抽象类也可以是接口,描述了所有实现类的抽象,是工厂与具体实现类的联结者,是多态的体现。

简单工厂模式分析

  • 简单工厂模式要解决的问题是如果创建合适的对象。
  • 简单工厂模式的核心思想是用一个类来负责对象的具体创建工作
  • 抽象接口与具体实现可能是多层级继承/实现的关系

代码实现(计算器)

/** * <h1>算法骨架</h1> * <p> *      每一种算法都要继承这个类,<br> *    并在getResult中实现具体的算法 * </p> * */public abstract class Operation {    private double _numberA = 0;    private double _numberB = 0;    public double get_numberA() {        return _numberA;    }    public void set_numberA(double _numberA) {        this._numberA = _numberA;    }    public double get_numberB() {        return _numberB;    }    public void set_numberB(double _numberB) {        this._numberB = _numberB;    }    public abstract double getResult() throws Throwable;}
/** * <h1>加法</h1> * */public class AddOperation extends Operation {    @Override    public double getResult() {        double result = 0;        result = get_numberA() + get_numberB();        return result;    }}
/** * <h1>减法</h1> * */public class SubOperation extends Operation {    @Override    public double getResult() {        double result = 0;        result = get_numberA() - get_numberB();        return result;    }}
/** * 乘法 * */public class MulOperation extends Operation {    @Override    public double getResult() {        double result = 0;        result = get_numberA() * get_numberB();        return result;    }}
/** * <h1>除法</h1> * */public class DivOperation extends Operation{    @Override    public double getResult() throws Exception {        // TODO Auto-generated method stub        double result = 0;        if(get_numberB() == 0){            throw new Exception("除数不能为0");        }        result = get_numberA() / get_numberB();        return result;    }}
/*** * 简单工厂创建代表具体算法的操作符类 * */public class OperationFactory {    private OperationFactory(){}    public static Operation createOperation(String opt){        Operation operation = null;        switch(opt){           case "+" :               operation = new AddOperation();               break;           case "-" :               operation = new SubOperation();               break;           case "*" :               operation = new MulOperation();               break;           case "/" :               operation = new DivOperation();               break;        }        return operation;    }}
public class Client {    public static void main(String[] args) throws Throwable{          Operation opt = null;          opt = OperationFactory.createOperation("+");          opt.set_numberA(5);          opt.set_numberB(4);          double result = opt.getResult();          System.out.println(result);    }}

优点和缺点

在实践中,只有了解一样工具能做什么 不能做什么,才能应用的得心应手,设计模式亦是如此。
优点:

  • 将对象的创建聚合到一个类中
  • 通过工厂和抽象接口将具体实现接耦合
  • 通过以上两种方式优化了代码结构

缺点:

  • 当实现类超过一定数量时,工厂类会过于庞大,难以维护
  • 违背了软件设计的开闭原则,及对扩展开放、对修改禁止,每当需要扩展时,都需要修改工厂类中的代码。
  • 违背了软件设计的单一责任原则,工厂类即要负责判断创建何种对象,又要负责定义如何创建对象。

应用场景

JDBC接口与各个数据库厂商的驱动程序。

0 0
原创粉丝点击