跟着实例学习设计模式(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:业务实现解耦。

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


java/android 设计模式学习笔记(8)---桥接模式

这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一。桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分...

跟着实例学习设计模式(9)-桥接模式bridge(结构型)

桥接模式属于结构型设计模式。 设计意图:将抽象部分与实现部分分离,使它们都可以独立的变化。 一看到设计意图,大家可能有些发懵,我们看到的继承和接口不都是抽象和实现分离的吗?尤其是接口和抽象类都是这样的...
  • andy_gx
  • andy_gx
  • 2015年07月15日 00:13
  • 1794

Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)

模式描述 提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。 2.模式作用 可以一定程度上解耦,消费者和产品实现类隔离开...

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

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

[设计模式学习笔记二][创建型模式][工厂方法(Factory Method)]

本文是我学习刘伟技术博客的笔记,博客链接如下: http://blog.csdn.net/lovelion/article/details/17517213 我做的这部分笔记,鉴于自身水平有限,...

Scala设计模式Part I. 创建模式——3.工厂方法

描述 工厂方法的意图是: 定义一个对象创建接口,但是让子类决定实例化哪个类。工厂方法让类的实例化延迟到子类。 工厂方法通常用于实例化时无法确定其类型的情况。GOF中以一个应用程序框架为例。抽...
  • xxfigo
  • xxfigo
  • 2016年05月25日 23:21
  • 932

java创建型设计模式-工厂方法(1)

什么是工厂方法模式?定义产品:实例(对象)。工厂:生产产品,即实例(对象)。工厂方法模式(Factory Method):不通过构造方法实现对类的实例化,而是通过一个工厂类(Factory class...

设计模式-创建型02-工厂方法

一,动机 针对前面的简单工厂,虽然能比较方便的创建对象,但是,它对拓展很不方便。假如要增加一个新的产品则必须修改工厂的方法,这不符合“开闭原则”.于是,工厂方法模式应运而生, 二,定义 工厂父类负责...

设计模式(3) 工厂方法(Factory Mehod)

问题聚焦: 工厂方法与抽象工厂的区别 别名:虚构造器(Virtual Constructor)

【设计模式基础】创建型模式 - 4 - 工厂方法(Factory Method)

1. 模式意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂方法模式是简单工厂模式的进一步抽象和推广。 由于使用了多态,工厂方法模式保持了简...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:跟着实例学习设计模式(3)-工厂方法(创建型)
举报原因:
原因补充:

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