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

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

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

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

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

类图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

通过工厂方法模式的类图能够看到。工厂方法模式有四个要素:

  • 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品的创建。
  • 工厂实现。在编程中,工厂实现决定怎样实例化产品。是实现扩展的途径,须要有多少种产品。就有多少个详细的工厂实现类,每一个工厂实现类负责创建一种产品。
  • 产品接口。

    产品接口的主要目的是定义产品的规范,全部的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的。产品接口定义的优劣直接决定了调用者代码的稳定性。

  • 产品实现。

    实现产品接口的详细类,不同的产品也须要不同的产品实现类。产品实现类与功能创建类相相应。

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

我来看代码实例:

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:业务实现解耦。

工厂方法是静态工厂的进一步抽象与推广,因为使用了多态性。工厂方法模式保持了静态工厂的长处同一时候又克服了它的缺点,只是工厂方法自己的缺点是每加一个产品都须要添加一个工厂类。添加了大量的开发工作量。

时间: 2024-10-09 13:35:54

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

跟着实例学习设计模式-抽象工厂

抽象工厂属于创建型设计模式 设计意图:提供一个接口,可以创建一系列相关或相互依赖的对象,而无须指定它们具体的类. 光看设计意图有些抽象,不好理解,让我们来看一下实例类图,结合类图我们再做具体的解释,相信会让大家豁然开朗的.我们以生产汽车为例,我们生产的汽车分两个系列,小车.卡车,每个系列汽车都有发动机和油箱. 上图: IAbstrcatFactory:抽象工厂接口,声明创建抽象产品的方法. CarFactory:小车工厂实现类. TrunkFactory:卡车工厂实现类. 这里我们为每个系列提供

跟着实例学习设计模式-静态工厂

静态工厂设计模式是创建型设计模式. 设计意图:实例化出我们需要的类对象,这些对象可以实现不同的功能,也可能只实现一个功能! 类图关系: 通过类图关系我们可以看到静态工厂负责创建OperationFather类的对象,我们来看一下实例代码. 我们是想实现一个计算器,计算器的功能暂时有加法.减法功能,以后可能随时增加新的功能如乘法.除法等.如果使用一般的做法,实际上我们写一个类就可以实现. package com.factory.staticfactory; /** * @author gaoxu

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

抽象工厂属于创建型设计模式 设计意图:提供一个接口.能够创建一系列相关或相互依赖的对象,而无须指定它们详细的类. 光看设计意图有些抽象,不好理解.让我们来看一下实例类图,结合类图我们再做详细的解释,相信会让大家豁然开朗的.我们以生产汽车为例,我们生产的汽车分两个系列,小车.卡车,每一个系列汽车都有发动机和油箱. 上图: IAbstrcatFactory:抽象工厂接口,声明创建抽象产品的方法. CarFactory:小车工厂实现类. TrunkFactory:卡车工厂实现类. 这里我们为每一个系列

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

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

设计模式(三): FACTORY工厂模式 -- 创建型模式

1.定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类. 2.适用场景 1.第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来.Java Collection中的iterator() 方法即属于这种情况. 2.第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给

设计模式(四):SIMPLE FACTORY简单工厂模式 -- 创建型模式

1.定义 简单工厂模式又称静态工厂方法模式.重命名上就可以看出这个模式一定很简单.它存在的目的很简单:定义一个用于创建对象的接口. 2.适用场景 如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用.后来出现工业革命.用户不用去创建宝马车.因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建.比如想要320i系列车.工厂就创建这个系列的车.即工厂可以创建产品. 3.评价 优点: 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现. 3.评价 1.它分离了具体的类 2.它使得易于交换产品系列 3.它有利于产品的一致性 4.难以支持新种类的产品 5."开放-封闭"原则要求系统对扩展开放,对修改封闭.通过扩展达到增

浅析设计模式(六)——创建型模式之Abstract-Factory(抽象工厂模式)

抽象工厂模式Abstract-Factory 本文的套路: 抽象工厂模式的定义 抽象工厂模式的参与者及其角色 抽象工厂模式的类图 抽象工厂模式的示例 参考 抽象工厂模式的定义 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 前面[浅析设计模式(四)--创建型模式之Simple-Factory(简单工厂方法,非设计模式)]中介绍的简单工厂方法,虽然已经对变化的部分进行了封装,但是这里只由一个对象负责所有的具体类的实例化,因此每次有新增对象类型时,都需要改变工厂的源码进行扩展.

设计模式二: 工厂方法(Factory Method)

设计模式二: 工厂方法(Factory Method) 简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个工厂, 这样的好处是当有新产品引入时可以不修改具体的工厂角色. 意图 定义了一个创建对象的接口,但由子类决定要实例化哪个类.工厂方法把实例化操作推迟到子类. 类图 实现 以汽车举例. 按照本模式核心的四个角色分别定义, 并增加模式调用角色(此处

设计模式之工厂方法模式

anticipate 预料 = except ant蚂蚁 ic ic卡 ip ip卡 ate吃 我没有预料到小蚂蚁把我的ic,ip卡吃掉了. robust 强壮的 = strong ro rong容祖儿  bu不  st石头 容祖儿不喜欢强壮的石头. maintain 维持 = keep main主要的(大陆)  tain 台湾 大陆和台湾维持着若即若离的关系. 设计模式之工厂方法模式 动机:     一个工厂方法factory method定义了一个接口来创建对象,但是让子类去选择创建哪一个,