现在的位置: 首页 > 综合 > 正文

工厂模式

2018年09月29日 ⁄ 综合 ⁄ 共 2228字 ⁄ 字号 评论关闭

1.简单工厂模式
它由三种角色组成:
工厂类角色:本模式的核心,含有一定的判断逻辑和商业逻辑,在java中由一个具体类实现;
抽象产品角色:具体产品所继承的父类或实现的接口,在java中由一个抽象类或接口来实现;
具体产品角色:工厂类所创建的对象就是此角色,在java中由一个具体类实现。
以一个计算器程序为例,我们来分析,代码如下:

Operation类:

class Operation{
	public double numberOne;
	public double numberTwo;
	private String oper;
	public double getResult(){
		double result = 0;
		return result;
	}
}
class operationAdd extends Operation{
	public double getResult(){
		double result = numberOne + numberTwo;
		return result;
	}
}
class operationMinus extends Operation{
	public double getResult(){
		double result = numberOne - numberTwo;
		return result;
	}
}
class operationFactory{
	public static Operation getOperation(String oper){
		Operation operation = null;
		switch(oper){
			case "+":
		          operation =  new operationAdd();
                          break;
			case "-":
		          operation =  new operationMinus();
                          break;
		}
		return operation;
	}
}

客户端程序:

public static void main(String[] args) {
		Operation operation = operationFactory.getOperation("+");
		operation.numberOne = 1;
		operation.numberTwo = 2;
		System.out.println(operation.getResult());
	}

我们先看简单工厂模式解决了什么问题:首先,它实现了计算器类的复用(即实现了运算与输入输出逻辑的分离),无论是什么客户端,只要在客户端设置相应的运算符和要计

算的值就能得到正确的计算结果,我们不需要因为客户端的不同而更改计算器类;其次,如果我们添加新的运算,那么我们只需要增加新的类,而不会影响现有的计算类,也就

是扩展性好;再次,如果我们更改某个运算规则那么不会影响到其它运算类,可维护性好。

简单工厂模式最大的优点是在工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖,但是在更改工厂类的

时候,我们不仅对扩展开放了,也对修改开放了,违背了开放-封闭原则。

然后我们看看简单工厂模式存在的问题:我们如果增加新的运算类,那么还需要更改工厂类的switch部分,这个问题就比较明显了,我们可能会不小心更改了已有的逻辑,这个

就是可维护性不好和可扩展性不好的表现。因此我们要将生产Operation对象的逻辑从operationFactory中分离出来。

利用工厂方法模式实现计算器的工厂类:
工厂方法模式中的角色:
抽象工厂角色:本模式的核心,具体工厂角色必须实现的接口或必须继承的父类,在java中用一个接口或一个抽象类来实现;
具体工厂角色:含有和业务逻辑相关的代码,由应用程序调用以创建对应的具体产品的对象,在java中由具体类来实现;
抽象产品角色:具体产品角色要继承的父类或实现的接口,在java中用一个接口或抽象类实现;

具体产品角色:抽象产品角色的实现,在java中用一个具体类来实现。

interface operationFactory{
	Operation getOperation();
}
class AddFactory implements operationFactory{
	public Operation getOperation(){
		return new operationAdd();
	}
}
class MinusFactory implements operationFactory{
	public Operation getOperation(){
		return new operationMinus();
	}
}

客户端:

public static void main(String[] args) {
	operationFactory of = new AddFactory();
	Operation operation = of.getOperation();
	operation.numberOne = 1;
	operation.numberTwo = 2;
	System.out.println(operation.getResult());
	
}

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
用工厂方法模式实现时,客户端需要决定实例化哪个工厂来实现运算类,选择判断的问题还是存在的,也就是,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,
想要加功能,本来是改工厂类的,现在是改客户端。
工厂方法模式完全符合开闭原则,但是它也存在问题,即当产品种类众多时,就会出现大量的与之对应的工厂类。

【上篇】
【下篇】

抱歉!评论已关闭.