`
阅读更多

一、JAVA工厂模式

 

  • 工厂模式专门负责将大量有共同接口的类实例化。
  • 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类

二、工厂模式的几种形态

 

  1. 简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern)
  2. 工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式
  3. 抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式

三、简单工厂实例

 

  • 比如说有一个农场公司,专门向市场销售各类水果。在这个系统里需要描述下列的水果:
  • 葡萄 Grape,草莓 Strawberry,苹果 Apple
  • 水果与其他的植物有很大的不同,就是水果最终是可以采摘食用的。
  • 那么一个自然的作法就是建立一个各种水果都适用的接口,以便与农场里的其他植物区分开。

  • public interface Fruit
    {
    	/**
    	* 生长
    	*/
    	void grow();
    	/**
    	* 收获
    	*/
    	void harvest();
    	/**
    	* 种植
    	*/
    	void plant();
    }
    
     
    类Apple 的源代码
    public class Apple implements Fruit
    {
    	private int treeAge;
    	public void grow()
    	{
    		log("Apple is growing...");
    	}
    	public void harvest()
    	{
    		log("Apple has been harvested.");
    	}
    	public void plant()
    	{
    		log("Apple has been planted.");
    	}
    	public static void log(String msg)
    	{
    		System.out.println(msg);
    	}
    	public int getTreeAge()
    	{
    		return treeAge;
    	}
    	public void setTreeAge(int treeAge)
    	{
    		this.treeAge = treeAge;
    	}
    }
     
    类Grape 的源代码
    public class Grape implements Fruit
    {
    	private boolean seedless;
    	public void grow()
    	{
    		log("Grape is growing...");
    	}
    	public void harvest()
    	{
    		log("Grape has been harvested.");
    	}
    	public void plant()
    	{
    		log("Grape has been planted.");
    	}
    	public static void log(String msg)
    	{
    		System.out.println(msg);
    	}
    	public boolean getSeedless()
    	{
    		return seedless;
    	}
    	public void setSeedless(boolean seedless)
    	{
    		this.seedless = seedless;
    	}
    }
    
     
    类Strawberry 的源代码
    public class Strawberry implements Fruit
    {
        public void grow()
        {
        	System.out.println("Strawberry is growing...");
        }
        public void harvest()
        {
        	System.out.println("Strawberry has been harvested.");
        }
        public void plant()
        {
            System.out.println("Strawberry has been planted.");
        }
    }
    
     
    FruitGardener 类的源代码
    public class FruitGardener
    {
        public static Fruit factory(String which) throws BadFruitException
        {
            if (which.equalsIgnoreCase("apple"))
            {
                return new Apple();
            }
            else if (which.equalsIgnoreCase("strawberry"))
            {
                return new Strawberry();
            }
            else if (which.equalsIgnoreCase("grape"))
            {
                return new Grape();
            }
            else
            {
             	throw new BadFruitException("Bad fruit request");
            }
        }
    }
    
     
  • 工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。
  • 工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java 类实现。
  • 抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
  • 抽象产品角色可以用一个Java 接口或者Java 抽象类实现。
  • 具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java 类实现

四、简单模式的优缺点

 

优点:

  • 模式的核心是工厂类。这个类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。
  • 而客户端则可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。
  • 简单工厂模式通过这种做法实现了对责任的分割。

缺点(一):

  • 当产品类有复杂的多层次等级结构时,工厂类只有它自己。以不变应万变,就是模式的缺点。
  • 这个工厂类集中了所有的产品创建逻辑,形成一个无所不知的全能类,有人把这种类叫做上帝类(God Class)。
  • 如果这个全能类代表的是农场的一个具体园丁的话,那么这个园丁就需要对所有的产品负责,成了农场的关键人物,
  • 他什么时候不能正常工作了,整个农场都要受到影响。

缺点(二):

  • 当产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。
  • 这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难

缺点(三):

  • 由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构

“开–闭”原则

  • “开–闭”原则要求一个系统的设计能够允许系统在无需修改的情况下,扩展其功能。
  • 简单工厂角色只在有限的程度上支持“开–闭”原则。

五、工厂方法模式

 

  • 工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
  • 首先,在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。
  • 这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节
  • 结构图:


  •  

六、工厂方法模式的系统涉及到的角色

 

抽象工厂(Creator)角色:

  • 担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。
  • 任何在模式中创建对象的工厂类必须实现这个接口。
  • 在上面的系统中这个角色由Java 接口Creator 扮演;在实际的系统中,这个角色也常常使用抽象Java 类实现。

具体工厂(Concrete Creator)角色:

  • 担任这个角色的是实现了抽象工厂接口的具体Java 类。
  • 具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
  • 在本系统中给出了两个这样的角色,也就是具体Java 类ConcreteCreator1 和ConcreteCreator2

抽象产品(Product)角色:

  • 工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
  • 在本系统中,这个角色由Java 接口Product 扮演;在实际的系统中,这个角色也常常使用抽象Java 类实现

具体产品(Concrete Product)角色:

  • 这个角色实现了抽象产品角色所声明的接口。
  • 工厂方法模式所创建的每一个对象都是某个具体产品角色的实例

七、实例(农场)

 

 

八、工厂方法模式和简单工厂模式

 

  • 工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上
  • 工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。
  • 与简单工厂模式中的情形一样的是,ConcreteCreator 的factory() 方法返还的数据类型是一个抽象类型Product,
  • 而不是哪一个具体产品类型,而客户端也不必知道所得到的产品的真实类型。
  • 这种多态性设计将工厂类选择创建哪一个产品对象、如何创建这个对象的细节完全封装在具体工厂类内部
  • 对于增加新的产品类而言,这个系统完全支持“开-闭”原则。

九、抽象工厂模式的结构

 

  • 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广
  • 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。
  • 那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式。
  • 这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品
  • 示例:

  • 一般而言,有多少个产品等级结构,就会在工厂角色中发现多少个工厂方法
  • 每一个产品等级结构中有多少具体产品,就有多少个产品族,也就会在工厂等级结构中发现多少个具体工厂

十、在什么情形下应当使用抽象工厂模式?

 

  1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂模式都是重要的(这一条叫做抽象工厂模式的原始用意。)
  2. 这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品;
  3. 同属于同一个产品族的产品是在一起使用的,这一约束必须要在系统的设计中体现出来
  4. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现

十一、抽象工厂模式与工厂方法模式的区别

 

  • 抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构
  • 大小: 51.2 KB
  • 大小: 52.2 KB
  • 大小: 66.5 KB
  • 大小: 96.5 KB
  • 大小: 46.5 KB
  • 大小: 37 KB
  • 大小: 55.3 KB
分享到:
评论

相关推荐

    java设计模式之工厂模式

    java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式...

    Java 工厂设计模式例题

    例题简单的阐述了Java工厂模式的概念,有利于读者更好地了解Java工厂模式

    Java 工厂模式 抽象工厂 工厂方法模式

    本文将深入探讨Java中的工厂模式,包括基本的工厂模式、抽象工厂模式以及工厂方法模式。 **工厂模式**:工厂模式的核心思想是提供一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。这样,客户端无需...

    java三种工厂模式文档+三个实例.rar

    Java工厂模式是面向对象设计模式中的一个重要概念,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建对象时不直接实例化具体类,而是通过一个接口或者抽象类来间接创建。这种模式的核心在于将对象的创建过程...

    三种工厂模式java实现

    下面我们将详细探讨这三种工厂模式在Java中的实现。 **1. 简单工厂模式** 简单工厂模式是最早期的工厂模式形式,它通过一个静态工厂方法来创建对象。在Java中,我们定义一个工厂类,包含一个静态方法,根据传入的...

    Java中工厂模式案例

    在软件设计模式中,工厂模式是一种非常基础且实用的创建型模式,它的主要目标是将对象的创建过程封装起来,使得代码更加灵活,同时也降低了对象间的...因此,熟练掌握工厂模式对于任何Java开发者来说都是非常重要的。

    java 工厂模式代码

    在软件设计模式中,工厂模式是一种非常基础且实用的创建型模式。它的主要目的是提供一个创建对象的接口,隔离了具体类的实例化过程,使得客户端可以无须知道所创建的对象的具体类,只需要知道它是从某个特定的工厂来...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    在Java中,简单工厂模式、工厂方法模式和抽象工厂模式是三种常见的实现方式。简单工厂模式虽然简单易懂,但扩展性较差,因为它将所有产品类型硬编码在工厂类中。工厂方法模式通过定义创建对象的接口,让子类决定实例...

    java工厂方法模式

    同时,工厂方法模式也可以避免简单工厂模式的缺点,即当有新产品要加入到系统中时,必须对工厂类进行修改,以加入必要的处理逻辑。 工厂方法模式适合在如下场合中运用: * 当无法得知必须创建的对象属于哪个类的...

    工厂模式(简单工厂,普通工厂,抽象工厂)代码java

    在软件设计模式中,工厂模式是一种非常常用的行为型模式,它的主要目的是为了隔离对象的创建过程,使得客户端代码不直接创建对象,而是通过一个...阅读并理解这些代码有助于深入理解工厂模式及其在Java编程中的应用。

    java工厂模式试学教程(视频)

    java工厂模式试学教程(视频) java工厂模式试学教程(视频)

    Java工厂模式

    Java工厂模式是一种设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建对象时,我们不会对客户端暴露创建逻辑,而是引用一个共同的接口来指向新创建的对象。这种模式使得系统在不指定...

    java 反射工厂模式

    Java反射和工厂模式是两种非常重要的编程概念,它们在软件设计和实现中起着关键作用。反射机制允许我们在运行时动态地获取类的信息并操作对象,而工厂模式是一种设计模式,它提供了一种创建对象的最佳方式,使得代码...

    java工厂模式java工厂模式.doc

    Java 工厂模式 Java 工厂模式是一种创建型设计模式,旨在提供一种统一的接口来创建对象。该模式主要有三种形式:简单工厂模式、工厂方法模式和抽象工厂模式。这些模式从上到下逐步抽象,并且更具一般性。 一、引子...

    java c++ 工厂模式源代码

    在Java中,工厂模式通常分为简单工厂模式、工厂方法模式和抽象工厂模式三种类型。简单工厂模式有一个中心工厂类,负责创建所有对象;工厂方法模式将对象的创建过程交给子类处理,提高了代码的灵活性;抽象工厂模式则...

    JAVA工厂模式.ppt

    JAVA工厂模式.pptJAVA工厂模式.pptJAVA工厂模式.pptJAVA工厂模式.pptJAVA工厂模式.pptJAVA工厂模式.pptJAVA工厂模式.ppt

    设计模式之java工厂模式

    "设计模式之java工厂模式"是关于如何优雅地创建对象的一种经典设计模式,它属于创建者模式类别。创建者模式主要关注对象的创建,而工厂模式则在其中扮演着重要角色,因为它提供了一种抽象的方式来创建对象,从而使...

    java 简单工厂模式 源代码

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂...

    设计模式单例模式和工厂模式综合应用

    **代码**文件则提供了实际的Java实现,通过查看这些代码,我们可以看到单例模式和工厂模式如何在实践中被运用,包括类的定义、方法的实现以及如何通过代码调用来创建和管理对象。 总的来说,这个项目为学习和理解...

Global site tag (gtag.js) - Google Analytics