《大话设计模式》笔记Java代码实现(一)简单工厂模式

一、模式定义

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

二、uml图和模式结构

  • 工厂类角色Creator (LightSimpleFactory):工厂类在客户端的直接控制下(Create方法)创建产品对象。
  • 抽象产品角色Product (Light):定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。
  • 具体产品角色ConcreteProduct (BulbLight, TubeLight):定义工厂具体加工出的对象。

三、优缺点

  • 优点
    工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。
    客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
  • 缺点
    当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
    同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
    另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

四、课本实例采用java代码实现

Main.java

import java.util.Scanner;
import factory.OperationFactory;
import operation.Operation;
//客户端程序
public class Main {
    public static void main(String[] args) {
        try {
            Scanner in = new Scanner(System.in);
            System.out.println("请输入数字A");
            String strNumberA = in.nextLine();
            System.out.println("请选择运算符号(+、-、*、/):");
            String strOperate = in.nextLine();
            System.out.println("请输入数字B");
            String strNumberB = in.nextLine();
            double result;
            Operation oper;
            oper = OperationFactory.CreateOperate(strOperate);
            oper.setNumberA(Double.parseDouble(strNumberA));
            oper.setNumberB(Double.parseDouble(strNumberB));
            result = oper.GetResult();
            System.out.println("结果是:" + result);
            in.close();
        } catch (Exception e) {
            System.out.println("您的输入有错:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

OperationFactory.java

package factory;
//简单工厂类
import operation.Operation;
import operation.OperationAdd;
import operation.OperationDiv;
import operation.OperationMul;
import operation.OperationSub;
public class OperationFactory {
  public static Operation CreateOperate(String operate) {
      Operation oper = null;
      switch(operate) {
      case "+":
          oper=new OperationAdd();
          break;
      case "-":
          oper=new OperationSub();
          break;
      case "*":
          oper=new OperationMul();
          break;
      case "/":
          oper=new OperationDiv();
          break;
      default:
           break;
      }
      return oper;
  }
}

Operation.java

package operation;

public class Operation {
private double numberA = 0;
private double numberB=0;
public double getNumberA() {
    return numberA;
}
public void setNumberA(double numberA) {
    this.numberA = numberA;
}
public double getNumberB() {
    return numberB;
}
public void setNumberB(double numberB) {
    this.numberB = numberB;
}
public double GetResult() throws Exception {
    double result=0;
    return result;
}
}

OperationAdd.java

package operation;
//加法类
public class OperationAdd extends Operation {

    @Override
    public double GetResult() {
        double result=0;
        result=getNumberA()+getNumberB();
        return result;
    }

}

OperationDiv.java

package operation;
//除法类
public class OperationDiv extends Operation {
    @Override
    public double GetResult() throws Exception {
        double result=0;
            if(getNumberB()==0) {
                throw new Exception("除术不能为0。");
                }
        result=getNumberA()/getNumberB();
        return result;
    }
}

OperationMul.java

package operation;
//乘法类
public class OperationMul extends Operation {
    @Override
    public double GetResult() {
        double result=0;
        result=getNumberA()*getNumberB();
        return result;
    }
}

OperationSub.java

package operation;
//减法类
public class OperationSub extends Operation {
    @Override
    public double GetResult() {
        double result=0;
        result=getNumberA()-getNumberB();
        return result;
    }
}
Last modification:April 25th, 2019 at 05:06 pm

3 comments

  1. sc想     Windows 10 /    FireFox

    dd宅男福利 https://6wll.com

  2. 左岸     MacOS /    Google Chrome

    留个脚印~

    1. 星空     Windows 10 /    Google Chrome
      @左岸

      捕捉,大师球|´・ω・)ノ

Leave a Comment