跟着实例学习设计模式(3)-工厂方法(创建型)

原创 2015年07月10日 12:16:52

工厂方法属于创建型设计模式。

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

       静态工厂使用面向对象的方式,有效的解决了增加新产品给客户端和实现类带来的代码修改问题,封装了创建过程,减低了增加新产品带来的代码修改错误,但是新增功能需要修改客户端代码和工厂创建类的判断逻辑,这样的设计违背了开放-封闭原则,对扩展开放,对修改封闭,那我们就需要找一种方式避免增加新的功能时修改工厂创建方法的逻辑。(毕竟会对原有代码做修改难免会有失误)

工厂方法就是有效解决这个问题的设计模式。

类图:


通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:

  • 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品的创建。
  • 工厂实现。在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就有多少个具体的工厂实现类,每个工厂实现类负责创建一种产品。
  • 产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。
  • 产品实现。实现产品接口的具体类,不同的产品也需要不同的产品实现类,产品实现类与功能创建类相对应。

通过类图我们还可以看到,每增加一个产品就增加一个对应的工厂来创建它,这样整个工厂和产品体系都没有什么变化,而只是扩展的变化,这就完全符合开放-封闭的原则了。


我来看代码实例:

package com.factory.staticfactory.extend;

/**
 * @author gaoxu
 * 实践出真知!产品接口
 */
public interface IOperation {
	
	/**计算方法
	 * @author gaoxu
	 * @return
	 */
	public double calculate();

}

产品接口定义产品的处理方式。

package com.factory.staticfactory.extend;

/**
 * @author gaoxu
 * 实践出真知!抽象父类
 */
public abstract class AbstractOperation implements IOperation{
	double numA = 0;
	double numB = 0;
	public double getNumA() {
		return numA;
	}
	public void setNumA(double numA) {
		this.numA = numA;
	}
	public double getNumB() {
		return numB;
	}
	public void setNumB(double numB) {
		this.numB = numB;
	}

}

实现接口并提供数据设置公共的方法。

package com.factory.staticfactory.extend;

/**
 * @author gaoxu
 * 实践出真知!
 */
public class OperationAdd extends AbstractOperation{
	@Override
	public double calculate() {
		return numA+numB;
	}	
}

package com.factory.staticfactory.extend;

/**
 * @author gaoxu
 * 实践出真知!
 */
public class OperationSub extends AbstractOperation{
	@Override
	public double calculate() {
		return numA-numB;
	}	
}

加法、减发类实现各自的业务逻辑。

package com.factory.factorymethod;

import com.factory.staticfactory.extend.IOperation;

/**工厂方法接口
 * @author gaoxu
 * 实践出真知!
 */
public interface IFactory {
	public IOperation createOperation();
}

package com.factory.factorymethod;

import com.factory.staticfactory.extend.IOperation;
import com.factory.staticfactory.extend.OperationAdd;

/**加法工厂类
 * @author gaoxu
 * 实践出真知!
 */
public class AddFactory implements IFactory{
	public IOperation createOperation(){
		return new OperationAdd();
	}
}

package com.factory.factorymethod;

import com.factory.staticfactory.extend.IOperation;
import com.factory.staticfactory.extend.OperationSub;

/**减发工厂类
 * @author gaoxu
 * 实践出真知!
 */
public class SubFactory implements IFactory{
	
	public IOperation createOperation(){
		return new OperationSub();
	}

}

工厂方法的优点:

1:严格遵循面向对象类的设计原则,比如单一职能原则、开-闭原则、依赖倒置原则、迪米特原则。

2:业务实现解耦。

工厂方法是静态工厂的进一步抽象与推广,由于使用了多态性,工厂方法模式保持了静态工厂的优点同时又克服了它的缺点,不过工厂方法自己的缺点是每加一个产品都需要增加一个工厂类,增加了大量的开发工作量。


跟着实例学习设计模式(7)-原型模式prototype(创建型)

原型模式是创建型模式。 设计意图:用原型实例指定创建对象的类型,并通过拷贝这个原型来创建新的对象。 我们使用构建简历的例子的类图来说明原型模式。 类图: 原型模式主要用于对象的复制,它的核心是...
  • andy_gx
  • andy_gx
  • 2015年07月12日 23:18
  • 743

跟着实例学习设计模式(4)-抽象工厂(创建型)

抽象工厂属于创建型设计模式 设计意图:提供一个接口,可以创建一系列相关或相互依赖的对象,而无须指定它们具体的类。 光看设计意图有些抽象,不好理解,让我们来看一下实例类图,结合类图我们再做具体的解释,相...
  • andy_gx
  • andy_gx
  • 2015年07月12日 11:37
  • 532

跟着实例学习设计模式(1)-单例模式(创建型)

单例模式属于创建型设计模式。   设计意图:保证一个类只有一个实例,并提供一个访问它的全局访问点。   单例模式根据单例,一种是懒汉式单例。饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用...
  • andy_gx
  • andy_gx
  • 2015年07月06日 00:35
  • 812

跟着实例学习设计模式(2)-静态工厂(创建型)

静态工厂设计模式是创建型设计模式。 设计意图:实例化出我们需要的类对象,这些对象可以实现不同的功能,也可能只实现一个功能! 类图关系: 通过类图关系我们可以看到静态工厂负责创建OperationFa...
  • andy_gx
  • andy_gx
  • 2015年07月09日 21:22
  • 435

跟着实例学习设计模式(6)-生成器模式builder(创建型)

生成器模式是创建型设计模式。 设计意图:将一个复杂的类表示与其构造相分离,使得相同的构建过程能够得出不同的表示。 实例类图: IVehicleBuilder:抽象建造者,为创建一个Vehicle对...
  • andy_gx
  • andy_gx
  • 2015年07月12日 20:56
  • 828

设计模式分类(创建型模式、结构型模式、行为模式)

1.创建型模式 前面讲过,社会化的分工越来越细,自然在软件设计方面也是如此,因此对象的创建和对象的使用分开也就成为了必然趋势。因为对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能...
  • itpinpai
  • itpinpai
  • 2016年04月25日 18:51
  • 8086

设计模式【工厂方法模式】

本文主要是分享自己在学习设计模式过程中的心得与记录,有什么不当之处,望各位有心关注的看官,给予指证与说明。本文主要讲述【工厂方法模式】,望各位细细品读。【转载使用,请注明出处:http://blog....
  • ma_hoking
  • ma_hoking
  • 2014年09月23日 22:34
  • 1220

六种创建型设计模式的比较和总结

一、描述 创建型设计模式包括如下几个:简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、创建者模式(Bui...
  • tongyuehong
  • tongyuehong
  • 2015年05月02日 15:46
  • 1447

设计模式实例学习-工厂方法

设计模式实例学习-工厂方法定义概念定义(对象创建型模式) 定义一个用于创建对象的接口,让子类决定实例化那个类。工程方法使一个类的实例化延迟到其子类。 角色职责 抽象产品类 具体产品类 抽象工厂类...
  • u011035622
  • u011035622
  • 2015年11月16日 23:23
  • 480

创建型设计模式---工厂方法(开放封闭原则)

1:工厂方法模式是开放封闭原则
  • shiyeqiangldh
  • shiyeqiangldh
  • 2014年09月30日 14:19
  • 358
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:跟着实例学习设计模式(3)-工厂方法(创建型)
举报原因:
原因补充:

(最多只允许输入30个字)