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

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

跟着实例学习设计模式(5)-工厂方法 、抽象工厂的区别

工厂方法和抽象工厂都属于工厂模式,那么它们到底有什么区别呢?让我们来比较一下,首先我们从工厂接口的角度来分析一下。 工厂方法:               &#...

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

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

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

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

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

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

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

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

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

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

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

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

跟着实例学习设计模式(8)-适配器模式adapter(结构型)

适配器模式属于结构型设计模式 设计意图:将一个类的接口转换成客户希望的另外一个接口。A d a p t e r模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 该模式正如名字一样适配器,...

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

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

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

设计模式实例学习-工厂方法定义概念定义(对象创建型模式) 定义一个用于创建对象的接口,让子类决定实例化那个类。工程方法使一个类的实例化延迟到其子类。 角色职责 抽象产品类 具体产品类 抽象工厂类...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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