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

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

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

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

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

类图:

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

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

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

我来看代码实例:

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();
	}

}

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

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

时间: 2024-08-07 11:35:31

跟着实例学习设计模式-工厂方法的相关文章

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

工厂方法和抽象工厂都属于工厂模式,那么它们到底有什么区别呢?让我们来比较一下. 首先我们从工厂接口的角度来分析一下. 工厂方法: 工厂方法是创建一个产品的不同功能的创建接口,并且同分类不同功能的产品返回的产出物还得是相同的.例如:汽车的发动机的制造就可以使用工厂方法,发动机分为直喷式发动机.涡轮增压式发动机. 抽象工厂: 抽象工厂是创建具有级联关系的一系列产品的,例如汽车,汽车由发动机.油箱.轮胎等组成,那么个这样一个产品是由一些相关联的产品组成的并且又可以分系列(卡车.小汽车.跑车)的产品就可

Python设计模式——工厂方法模式(FactoryMethod)

需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = '[email protected]' class LeiFeng(): def buy_rice(self): pass def sweep(self): pass class Student(LeiFeng): def buy_rice(self): print '大学生帮你买米' def sweep(self

设计模式——工厂方法

目的 定义创建对象的方法/接口,然后让子类来决定创建具体的类的对象. 通过不同的类,使得实例化延迟至子类. 特点 必须引入继承,才能算是工厂方法模式. Found in JDK API java.util.Calendar#getInstance()java.text.NumberFormat#getInstance() java.lang.StringBuffer, java.lang.StringBuilder(继承自 AbstractStringBuilder) 变种 工厂方法是抽象的:

设计模式-工厂方法(Demo)

工厂方法 工厂方法跟简单工厂一样.都是创建型的设计模式.他解决了简单工厂的违背开放封闭的缺点. 故事 主人--人家做饭好累的.女仆抱着我大腿说着.自从上次把她买进家.没做了几次饭就喊累--看着她那出处可怜的眼神.罢了.再招几个女仆吧.话说还没给第一个女仆起名字.就叫'遥'吧.后来又招了'媛'和'悦'.然后让她们分别只做一道菜.遥做牛排.媛做红酒.悦做意大利面.这次每次我想吃牛排就直接跟遥说'吃饭',喝红酒就跟媛说'吃饭'而不用说吃什么了.因为她们每个人只做一道菜.以后要再想吃别的.就再招个女仆.

php设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——工厂方法模式(Factory Method) 4 */ 5 6 7 /* 8 * IAp

Android设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

4. 星际争霸之php设计模式--工厂方法模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248177.html============================================

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

工厂方法属于创建型设计模式. 设计意图:定义一个用于创建对象的接口.让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 静态工厂使用面向对象的方式,有效的攻克了添加新产品给client和实现类带来的代码改动问题.封装了创建过程,减低了添加新产品带来的代码改动错误.可是新增功能须要改动client代码和工厂创建类的推断逻辑,这种设计违背了开放-封闭原则.对扩展开放.对改动封闭,那我们就须要找一种方式避免添加新的功能时改动工厂创建方法的逻辑.(毕竟会对原有代码做改动难免会有失误) 工厂

Java设计模式—工厂方法模式&amp;抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub