java设计模式之工厂方法详解

一、概念

工厂方法模式是类的创建模式,又叫虚拟构造子模式(virtual constructor) 或者多态性工厂模式。

二、模式动机

定义一个抽像的工厂,将产品的具体创建工作推迟到抽像工厂的具体子类中,有些产品的创建非常复杂,试想如果将所有具体产品的创建工作都像简单工厂一样放到一个静态工厂方法中,那么这个工厂方法将无比巨大,且当需要扩展增加新的产品时,就必须修改原先的工厂方法,违背了开-闭原则,而工厂方法模式,对于每个具体产品的创建都有一个具体的工厂来创建,如果新增产品,只需要新增一个实现抽像工厂(或工厂接口)的具体工厂即可,也符合了开-闭原则。

三、模式的结构

从上图中我们可以看出,工厂方法涉及到4个角色

1.抽像工厂角色:该角色是工厂方法模式的核心,与应用程序无关,任何在模式中创建对像的工厂都必须实现这个接口,该角色往往是一个抽像的JAVA类或者接口。

2.具体工厂角色:该角色实现了抽像工厂,创建具体的产品,通常由一个具体的JAVA类来实现。

3.抽像产品角色:工厂方法模式所创建的产品的超类型,通常是一个JAVA抽像类或者JAVA接口。

4.具体产品角色:该角色实现了抽像产品接口,工厂方法所创建的每个对像都是这个角色的实例。

样例代码如下:

public abstract class Product
{

 /**
 * @roseuid 59AA7B2D03E7
 */
 public Product()
 {

 }
}

public class ConcreteProduct1 extends Product
{

 /**
 * @roseuid 59AA7B2D037A
 */
 public ConcreteProduct1()
 {

 }
}

public class ConcreteProduct2 extends Product
{

 /**
 * @roseuid 59AA7B2D03A1
 */
 public ConcreteProduct2()
 {

 }
}

public abstract class Creator
{

 /**
 * @roseuid 59AA7B1600C6
 */
 public Creator()
 {

 }

 /**
 * @return Product
 * @roseuid 59AA77070055
 */
 public abstract Product factoryMethod();
}

public class ConcreteCreator1 extends Creator
{

 /**
 * @roseuid 59AA7B2D031A
 */
 public ConcreteCreator1()
 {

 }

 /**
 * @return Product
 * @roseuid 59AA7707007B
 */
 public Product factoryMethod()
 {
 return new ConcreteProduct1();
 }
}

public class ConcreteCreator2 extends Creator
{

 /**
 * @roseuid 59AA7B2D034C
 */
 public ConcreteCreator2()
 {

 }

 /**
 * @return Product
 * @roseuid 59AA7707009B
 */
 public Product factoryMethod()
 {
  return new ConcreteProduct2();
 }
}
public class Client
{
 private Creator theCreator;

 /**
 * @roseuid 59AA7AFC02D7
 */
 public Client()
 {
    theCreator=new ConcreteCreator();
    Product product=thCreator.factoryMathod();

 }
}

四。模式样例

如现在有一个生产轮胎的工厂,该工厂可以生产benz车用的轮胎,还可以生产 bmw车子用的轮胎,后续还有可能生产audi车用的轮胎等等。由于 benz车用的轮态和bmw车子用的轮轮胎可能有比较大的差别,所用的材料和模具都会有所不同,工艺要求也不同,可以说要用不同的产品线(相当于一个子工厂)来生产(实例化),我们就可以用工厂的方法来

描述轮胎的产生过程,每个轮胎都颜色,都有寿命和胎面宽度等指标,于是我们可以抽像出一个轮胎的接口,所有的轮胎都应该是实现这个接口的类的实例,如下图所示:

当我们又增加了一条生产Audi车轮胎的产品线时,工厂方法能很好的适应,如上图我们只需增加一个AudiTire的具体产品类,然后再增加一个实例化该产品类的AudiTireFactory工厂就可以了,其它的工厂及产品类不需要做任何的修改,从此可以看出工厂方法模式对于同一产品等级下增加新的产品时是支持开闭原则的。

五、模式的约束

  该模式只针对一个产品等级结构下的产品进行有效扩展,如上例,如果我们要增一个发动机的产品,工厂类就无法适应了。

六、模式的变体与扩展

  如一个轮胎厂,他是benz旗下的子公司,他只生产benz车所使用的轮胎,那么这时抽像工厂类就没有必要了,只需要一个具体工厂就可以了,这时工厂方法模式的多态性工厂功能就退化了,如下图:

  往往工厂只需要一个实例就可以了,所以上图工厂类的factoryMethod()就可以直接改为静态的方法,这样就直接退化为了简单工厂模式。

  该工厂只生产benz车轮胎,那么轮胎的抽像接口其实也没有必要了,可以进一步退化如下图:

七、与其它模式的关系

  暂略

八、模式优缺点

    工厂方法模式,在同一个产品等级结构下,可以有效的支持开闭原则,但是不适用于增加新的产品等级结构

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java设计模式之工厂方法模式

    概要 设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美. 定义 定义一个用于创建对象的接口,让其子类去决定实例化那个类 使用场景 任何使用复杂对象的地方,都可以使用工厂模式 UML 1.抽象工厂 抽象工厂:我们都知道,工厂,一般只有一个作用,那就生产,比如,吉利汽车厂,那就制造吉利汽车,iphone手机制造厂就造iphone等等 所以可以用一个简单的方法概括,就是create(); 2.具体汽车制造厂 具体汽车制造厂:实现了抽象工厂,具有实际的制造汽车的流程和方法等 3.

  • Java使用设计模式中的工厂方法模式实例解析

    工厂方法模式的定义 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 它包含了如下角色: 抽象产品(Product) 具体产品(ConcreteProduct) 抽象工厂(Factory) 具体工厂(ConcreteFactory) 模式的UML

  • Java设计模式编程之工厂方法模式的使用

    定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 类型:创建类模式 类图: 工厂方法模式代码 interface IProduct { public void productMethod(); } class Product implements IProduct { public void productMethod() { System.out.println("产品"); } } interface IFactory { publ

  • Java设计模式之工厂方法模式实例简析

    本文实例讲述了Java设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式使用的频率非常高,在我们日常的开发中总能遇见到它的身影.其定义为:Define an interface for creating an object, but let subclass decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口

  • Java设计模式编程中的工厂方法模式和抽象工厂模式

    工厂方法模式 动机 创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展. 而且,有些对象的创建可以需要用到复合工厂访问不到的信息,所以,定义一个工厂接口,通过实现这个接口来决定实例化那个产品,这就是工厂方法模式,让类的实例化推迟到子类中进行. 目的 1. 定义一个接口,让子类决定实例化哪个产品. 2. 通过通用接口创建对象. 实现 1. 产品接口和具体产品很好理解. 2. 工厂类提供一个工厂方法,返回一个产品对象.但是这个工厂方法是

  • java设计模式之工厂方法详解

    一.概念 工厂方法模式是类的创建模式,又叫虚拟构造子模式(virtual constructor) 或者多态性工厂模式. 二.模式动机 定义一个抽像的工厂,将产品的具体创建工作推迟到抽像工厂的具体子类中,有些产品的创建非常复杂,试想如果将所有具体产品的创建工作都像简单工厂一样放到一个静态工厂方法中,那么这个工厂方法将无比巨大,且当需要扩展增加新的产品时,就必须修改原先的工厂方法,违背了开-闭原则,而工厂方法模式,对于每个具体产品的创建都有一个具体的工厂来创建,如果新增产品,只需要新增一个实现抽像

  • java设计模式-单例模式实现方法详解

    目录 饿汉式 静态变量 静态代码块 懒汉式 线程不安全 线程安全 双重检查 静态内部类 总结 a 饿汉式 所谓饿汉式,就是直接创建出类的实例化,然后用private私有化,对外只用静态方法暴露. 静态变量 步骤 构造器私有化 类的内部创建对象 向外暴露一个静态的公共方法 优点 缺点 写法简单,在类装载的时完成实例化,避免了线程同步问题 类装载时完成实例化,没有达到LazyLoading的效果,若该实例从未使用,则会造成内存浪费 class Singleton { //私有化构造器 private

  • Java设计模式之工厂方法模式详解

    目录 1.工厂方法是什么 2.如何实现 3.代码实现 4.工厂方法模式的优点 5.拓展 1.工厂方法是什么 众所周知,工厂是生产产品的,并且产品供消费者使用.消费者不必关心产品的生产过程,只需要关心用哪种产品就行. 在Java世界中,工厂方法模式和现实功能类似.工厂即一个工厂类,提供获得对象(产品)的方法(工厂方法).其他类(消费者)需要用到某个对象时,只需调用工厂方法就行,不必new这个对象. 2.如何实现 1)创建产品的抽象类或接口---抽象产品 2)创建具体产品的类---具体产品 3)创建

  • Java设计模式之命令模式详解

    命令模式 定义:将请求封装成对象,这可以让你使用不同的请求.队列.或者日志来参数化其他对象. 何时使用命令模式?当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式. 在被解耦的两者之间是通过命令对象进行沟通的.命令对象封装了接收者和一个或一组动作. 调用者通过调用命令对象的execute()方法发出请求,这会使接收者的动作被调用. 调用者可以接收命令当作参数,甚至在运行时动态地进行. 优点: 1.降低了系统耦合度. 2.新的命令可以很容易添加到系统中去. 缺点:使用命令模式可能会导致

  • Java设计模式之原型模式详解

    一.前言 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式.在实际应用中,原型模式很少单独出现.经常与其他模式混用,他的原型类Prototype也常用抽象类来替代. 该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.在Java中,复制对象是通过clone()实现的,先创建一个原型类,通过实现Cloneable 接口 public class Prototype implements Cloneable { public

  • Java设计模式之代理模式详解

    一.代理模式 代理模式就是有一个张三,别人都没有办法找到他,只有他的秘书可以找到他.那其他人想和张三交互,只能通过他的秘书来进行转达交互.这个秘书就是代理者,他代理张三. 再看看另一个例子:卖房子 卖房子的步骤: 1.找买家 2.谈价钱 3.签合同 4.和房产局签订一些乱七八糟转让协议 一般卖家只在签合同的时候可能出面一下,其他的1,2,4都由中介去做.那你问这样有什么用呢? 首先,一个中介可以代理多个卖房子的卖家,其次,我们可以在不修改卖家的代码的情况下,给他实现房子加价.打广告等等夹带私货的

  • Spring框架开发IOC两种创建工厂方法详解

    1.IOC有两种创建工厂的方法 IoC 通过工厂模式创建 bean 的方式有两种: 静态工厂方法 实例工厂方法 2.两种方法的不同 2.1静态方法创建 就是直接可以通过静态方法来实例化一个对象,采用类名.方法名的方式创建 public class HelloFactory { public static HelloWorld getInstance(){ return new Hello(); } } HelloWorldFactory.getInstance(); 2.2实例方法创建 采用ne

  • Java设计模式之单例模式示例详解

    目录 0.概述 1.饿汉式 1.1 饿汉式单例实现 1.2 破坏单例的几种情况 1.3 预防单例的破坏 2.枚举饿汉式 2.1 枚举单例实现 2.2 破坏单例 3.懒汉式 4.双检锁懒汉式 5.内部类懒汉式 6.JDK中单例的体现 0.概述 为什么要使用单例模式? 在我们的系统中,有一些对象其实我们只需要一个,比如说:线程池.缓存.对话框.注册表.日志对象.充当打印机.显卡等设备驱动程序的对象.事实上,这一类对象只能有一个实例,如果制造出多个实例就可能会导致一些问题的产生,比如:程序的行为异常.

  • Java设计模式探究之观察者模式详解

    目录 1.观察者模式是什么 2.如何实现 3.代码实现 1)观察者接口 2)被观察者接口 3)观察者实现 4)被观察者实现 5)测试类 4.延伸拓展 1.观察者模式是什么 顾名思义,有两个对象,观察者和被观察者.当被观察者数据发生变化时,提醒观察者更新数据或状态. 2.如何实现 1)定义两个类,观察者和被观察者. 2)被观察者要维护一个集合,存放观察者对象.并且提供增删方法. 3)被观察者数据发生变化时,要调用观察者的方法,以便通知观察者更新数据或状态. 4)基于面向抽象原则,可以将观察者和被观

  • Java枚举的使用方法详解

     Java枚举的使用方法详解 前言  你代码中的flag和status,都应该用枚举来替代 很多人都说,枚举在实际开发中很少用到,甚至就没用到.因为,他们的代码往往是这样子的: public class Constant { /* * 以下几个变量表示英雄的状态 */ public final static int STATUS_WALKING = 0;//走 public final static int STATUS_RUNNINGING = 1;//跑 public final stati

随机推荐