Java实现工厂方法模式

摘要:
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

用之前简单工厂模式做的计算器举例,先看简单工厂模式的实现:

//计算接口

public interface Operation {

public double getResult(double _numberA, double _numberB);

}

//加法运算

public class OperationAdd implements Operation {

@Override

public double getResult(double _numberA, double _numberB) {

return _numberA + _numberB;

}

}

//减法运算

public class OperationSub implements Operation {

@Override

public double getResult(double _numberA, double _numberB) {

return _numberA - _numberB;

}

}

//乘法运算

public class OperationMul implements Operation {

@Override

public double getResult(double _numberA, double _numberB) {

return _numberA * _numberB;

}

}

//除法运算

public class OperationDiv implements Operation {

@Override

public double getResult(double _numberA, double _numberB) {

if (_numberB == 0) {

throw new RuntimeException("除数B不能为0.");

}

return _numberA / _numberB;

}

}

//运算类工厂

public class OperationFactory1 {

Operation oper = null;

public Operation createOperate(String operate) {

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;

}

}

工厂模式就是将之前的工厂类OperFactory变为一个工厂接口,然后加减乘除各建一个具体工厂去实现这个接口:

//运算类工厂

public class OperationFactory2 {

IFactory oper = null;

public IFactory createOperate(String operate) {

switch (operate) {

case "+":

oper = new AddFactory();

break;

case "-":

oper = new SubFactory();

break;

case "*":

oper = new MulFactory();

break;

case "/":

oper = new DivFactory();

break;

default:

break;

}

return oper;

}

}

//加法运算

public class AddFactory implements IFactory {

@Override

public Operation createOperation() {

return new OperationAdd();

}

}

//减法运算

public class SubFactory implements IFactory {

@Override

public Operation createOperation() {

return new OperationSub();

}

}

//除法运算

public class DivFactory implements IFactory {

@Override

public Operation createOperation() {

return new OperationDiv();

}

}

//乘法运算

public class MulFactory implements IFactory {

@Override

public Operation createOperation() {

return new OperationMul();

}

}

//除法运算

public class OperationDiv implements Operation {

@Override

public double getResult(double _numberA, double _numberB) {

if (_numberB == 0) {

throw new RuntimeException("除数B不能为0.");

}

return _numberA / _numberB;

}

}

下面来对比一下简单工厂模式和工厂模式的实现计算器:

import java.util.Scanner;

//简单工厂模式实现计算器

public class Calculator {

public static void main(String[] args) {

double numberA = 0d;

double numberB = 0d;

String operate = "";

double result = 0d;

try {郑州人流手术多少钱 http://www.zzzzyy120.com/

Scanner sc = new Scanner(System.in);

System.out.println("Java简单工厂模式计算器:");

System.out.println("请输入数字A:");

numberA = sc.nextDouble();

System.out.println("请选择运算符号(+、-、*、/):");

operate = sc.next();

System.out.println("请输入数字B:");

numberB = sc.nextDouble();

Operation operation = new OperationFactory().createOperate(operate);

if (operation == null) {

System.out.println("请在“+、-、*、/”选择正确的运算符");

} else {

result = operation.getResult(numberA, numberB);

System.out.println(String.format("您的计算结果是:%s %s %s = %s", numberA, operate, numberB, result));

}

sc.close();

} catch (Exception e) {

System.out.println(String.format("您的输入有误:%s", e.getMessage()));

}

}

}

import java.util.Scanner;

//工厂模式实现计算器

public class Calculator {

public static void main(String[] args) {

double numberA = 0d;

double numberB = 0d;

String operate = "";

double result = 0d;

try {

Scanner sc = new Scanner(System.in);

System.out.println("Java简单工厂模式计算器:");

System.out.println("请输入数字A:");

numberA = sc.nextDouble();

System.out.println("请选择运算符号(+、-、*、/):");

operate = sc.next();

System.out.println("请输入数字B:");

numberB = sc.nextDouble();

IFactory operation = new OperationFactory2().createOperate(operate);

if (operation == null) {

System.out.println("请在“+、-、*、/”选择正确的运算符");

} else {

result = operation.createOperation().getResult(numberA, numberB);

System.out.println(String.format("您的计算结果是:%s %s %s = %s", numberA, operate, numberB, result));

}

sc.close();

} catch (Exception e) {

System.out.println(String.format("您的输入有误:%s", e.getMessage()));

}

}

}

可以看出来,如果需要增加其他的运算方法,使用简单工厂模式时,工厂类OperationFactory2需要对原有的代码进行修改,就违背了开放-封闭原则。而采用工厂模式时,只需要增加一个新算法的工厂实现类,在调用时采用new OperationFactory2()就可以采用新的算法进行计算了。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内容逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂的,而现在是修改客户端。

免责声明:文章转载自《Java实现工厂方法模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇设置修改CentOS系统时区MYSQL获取自增ID的四种方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java 设计模式六原则及23中常用设计模式

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访...

创建对象_工厂方法(Factory Method)模式 与 静态工厂方法

  工厂方法模式:   定义:为创建对象定义一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟至子类。   应用场景: 客户类不关心使用哪个具体类,只关心该接口所提供的功能; 创建过程比较复杂,例如需要初始化其他关联的资源类,读取配置文件等; 接口有很多具体实现或者抽象有很多具体子类时,你可能需要为客户代码写一大串 if-else 逻辑来...

Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如...

C#设计模式总结(转)

一、引言   经过这段时间对设计模式的学习,自己的感触还是很多的,因为我现在在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构。所以,学完设计模式之后,感觉它会慢慢地影响到你写代码的思维方式。这里对设计模式做一个总结,一来可以对所有设计模式进行一个梳理,二来可以做一个索引来帮助大家收藏。   PS: 其实,很早之前我就看过所有的设计模式了,但是...