被说了很多遍的设计模式---工厂方法模式

[把你的理性思维慢慢变成条件反射]

本文,我们讲介绍工厂方法模式,文章主题结构与上位一致。惯例,先来看看我们示例工程的环境:

操作系统:win7 x64

其他软件:eclipse mars,jdk7

-------------------------------------------------------------------------------------------------------------------------------------

经典问题:

首先,请回顾前文我们介绍的计算机问题。在其文中,我们描述其缺点为: 工厂类包含的逻辑判断,需要极高的稳定性,安全性。否则,整个逻辑处理将会发生错误。因此,对于工厂类而言,经常的修改操作,会让其违反“开闭原则”。

思路分析:

要点一:使得对工厂了不能违反“开闭原则”

要点二:对客户端仍然保持面向接口编程。

示例工程:


首先,我们先使用简单工厂方法实现计算器的功能,代码放置在base包下,作为参照。具体代码请参考前文《简单工厂模式》。

为满足要点一,二,我们修改代码结构为如下内容:


创建IFactory.java文件,具体内容如下:

package com.csdn.ingo.gof_FactoryFuncion.one;

public interface IFactory {
	Operation CreateOperation();
}
创建AddFactory.java,DivFactory.java,MulFactory.java,SubFactory.java四个文件,在此仅示例AddFactory.java文件,具体内容如下:
package com.csdn.ingo.gof_FactoryFuncion.one;

public class AddFactory implements IFactory {

	@Override
	public Operation CreateOperation() {
		return new OperationAdd();
	}
}
创建OperationAdd.java,OperationDiv.java,OperationMul.java,OperationSub.java四个文件,在此仅示例OperationAdd.java文件,具体内容如下:

package com.csdn.ingo.gof_FactoryFuncion.one;

public class OperationAdd extends Operation {
	public double getResult(Operation op){
		double result = op.getNumA()+op.getNumB();
		return result;
	}
}
创建Window.java文件,具体内容如下:

package com.csdn.ingo.gof_FactoryFuncion.one;

import java.util.Scanner;

public class Window {
	public static void main(String[] args) {
		try {
			IFactory operFactory1 = new AddFactory();
			Operation oper1 = operFactory1.CreateOperation();
			oper1.setNumA(10);
			oper1.setNumB(23);
			System.out.println("加法工厂:"+oper1.getResult(oper1));
			
			IFactory operFactory2 = new SubFactory();
			Operation oper2 = operFactory2.CreateOperation();
			oper2.setNumA(10);
			oper2.setNumB(23);
			System.out.println("减法工厂:"+oper2.getResult(oper2));
			
			IFactory operFactory3 = new MulFactory();
			Operation oper3 = operFactory3.CreateOperation();
			oper3.setNumA(10);
			oper3.setNumB(23);
			System.out.println("乘法工厂:"+oper3.getResult(oper3));
			
			IFactory operFactory4 = new DivFactory();
			Operation oper4 = operFactory4.CreateOperation();
			oper4.setNumA(10);
			oper4.setNumB(23);
			System.out.println("除法工厂:"+oper4.getResult(oper4));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
采用工厂方法模式之后带来的优点:

  1. 移除原有工厂类,并移除其中的多级判断。
  2. 现在,对任何功能的新增,修改不会影响到其他现有功能。

模式总结:

本例UML结构图:


工厂方法模式标准UML图:


概念总结:

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

组成部分:Product(抽象产品),ConcreteProduct(具体产品),Creator(抽象工厂),ConcreteCreator(具体工厂)四部分组成。

模板代码:


创建ConcreteCreator.java,具体内容如下:

package com.csdn.ingo.gof_FactoryFuncion.three;

public class ConcreteCreator implements Creator {

	@Override
	public Product createProduct() {
		return new ConcreteProduct();
	}
}
创建ConcreteProduct.java文件,具体内容如下:

package com.csdn.ingo.gof_FactoryFuncion.three;

public class ConcreteProduct implements Product {

	@Override
	public void createProduct() {
		System.out.println("create product");
	}
}
创建Creator.java,具体内容如下:
package com.csdn.ingo.gof_FactoryFuncion.three;

public interface Creator {
	public Product createProduct();
}
创建Product.java,具体内容如下:

package com.csdn.ingo.gof_FactoryFuncion.three;
public interface Product {
	public void createProduct();
}
创建Window.java,具体内容如下:

package com.csdn.ingo.gof_FactoryFuncion.three;

public class Window {
	public static void main(String[] args) {
		Creator creator = new ConcreteCreator();
		Product product = creator.createProduct();
		product.createProduct();	
	}
}<span style="font-family:Microsoft YaHei;font-size:14px;">
</span>

问题:简单工厂模式与工厂方法模式有什么不同之处?

答:简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。对本例而言,采用简单工厂模式,客户端指明一个方法运算符号就可以进行相关运算,而现在,客户端需要明确指明到底实例化那个工厂类才能够进行相关计算。但是,请注意,客户端指明的接口,即在实际使用时,实例化的过程将会延迟到运行时才确定。另外,仔细观察就会发现,本身的工厂类内的逻辑判断只是从一个位置转移到另一个位置,逻辑判断的过程仍然存在于程序当中。使用这种方法,满足了我们再前文中介绍的“迪米特法则”。

反思:

应用场景:

  1. 在客户端可能需要生成复杂对象时,只需声明抽象工厂即可使用。
  2. 实现调用方与被调用方的关系解耦,需要实现多态,“里氏代换原则”时
  3. 具体的实现了需要修改,扩展,维护,运行时切换等。

优点:

  1. 工厂方法负责创建具体的产品,客户端不在关注创建,实例化,甚至是类名等细节。
  2. 工厂角色,具体产品实现多态。工厂有权决定声明,实例化哪一种具体对象。
  3. 当新增或修改新产品时,对现有的功能,及客户端几乎不产生任何影响。

缺点:

  1. 当存在大量的具体产品类时,需要创建相同数量的工厂类。系统中类的个数将成加倍增加,带来了安装,维护上的成本。
  2. 为了实现抽象,运行时切换功能等,客户端可能需要额外实现配置文件,并且需要使用反射等技术。

-------------------------------------------------------------------------------------------------------------------------------------

至此,被说了很多遍的设计模式---工厂方法模式 结束


参考资料:

图书:《大话设计模式》

其他博文:http://blog.csdn.NET/lovelion/article/details/7563445


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值