`

设计模式之工厂模式Factory

    博客分类:
  • Java
阅读更多

工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。

工厂模式主要用以下几种形态: 简单工厂(Simple Factory), 工厂方法(Factory Method), 抽象工厂(Abstract Factory)

 

1. 简单工厂模式 Simple Factory

        简单工厂又叫静态工厂 ,是工厂模式三中状态中结构最为简单的它主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。

        我们来看一个具体的例子:假设一家工厂,几生产洗衣机,有生产冰箱,还有空调等等。我们先为所有产品定义一个共同的产品接口如下:

public interface Product{} 

         接着我们让这个工厂的所有产品都必须实现此接口,其Java代码如下:

public class Washer implements Product
{
        public Washer()
        {
                System.out.println("制造了一台洗衣机.");
        }
}

public class Icebox implements Product
{
        public Icebox()
        {
                System.out.println("制造了一台冰箱.");
        }
}

public class AirCondition implements Product
{
        public Icebox()
        {
                System.out.println("制造了一台空调.");
        }
}

 

       接下来我们来写一个工厂类,由它来负责生产以上的产品,其Java代码如下:

public class SimpleFactory
{
        public static Product factory(String productName) throws Exception
        {
                if(productName.equals("Washer"))
                {
                        return new Washer();
                }
                else if(productName.equals("Icebox"))
                {
                        return new Icebox();
                }
                else if(productName.equals("AirCondition"))
                {
                        return new AirCondition();
                }
                else
                {
                        throw new Exception("暂时无法生产该商品.");
                }
        }
}

        有了这个工厂类,我们就可以开始下定单了,SimpleFactory 将根据不同的定单类决定生产什么产品。

public static void main(String[] args)
 {
        try
        {
                SimpleFactory.factory("Washer");
                SimpleFactory.factory("Icebox");
                SimpleFactory.factory("AirCondition");
        } 
        catch (Exception e)
        {
                e.printStackTrace();
        }
}

        由上面的代码可以看出,简单工厂的核心就是一个SimpleFactory 类,他拥有必要的逻辑判断能力和所有产品的创建权利,我们只需要向把定单给他,就能得到我们想要的产品。这使用起来似乎非常方便。但实际上,这个SimpleFactory 有很多的局限。

        首先,我们每次想要增加一种新产品的时候,都必须修改SimpleFactory 的原代码。

        其次,当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖两个字...
        还有就是,整个系统都严重依赖SimpleFactory 类,只要SimpleFactory 类一出问题,系统就进入不能工作的状态,这也是最为致命的一点....
        以上的不足将在工厂模式的另外两种状态中得到解决。

 

2. 工厂方法Factory Method

        上面的代码告诉我们,简单工厂 并不简单,它是整个模式的核心,一旦他出了问题,整个模式都将受影响而不能工作,为了降低风险和为日后的维护、扩展做准备,我们需要对它进行重构,引入工厂方法
        工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能,以下是工厂接口的定义:

public interface Factory
{
        public Product create();
}

       我们再来定义一个产品接口:

public interface Product { }

       以下是实现了产品接口的产品类:

public class Washer implements Product
{
        public Washer()
        {
                System.out.println("制造了一台洗衣机.");
        }
}

public class Icebox implements Product
{
        public Icebox()
        {
                System.out.println("制造了一台冰箱.");
        }
}

public class AirCondition implements Product
{
        public Icebox()
        {
                System.out.println("制造了一台空调.");
        }
}

        接下来,就是工厂方法的核心部分,也就是具体创建产品对象的具体工厂类:

//创建洗衣机的工厂
public class CreateWasher implements Factory
{
        public Product create()
        {
                return new Washer();
        }
}

//创建冰箱的工厂
public class CreateIcebox implements Factory
{
        public Product create()
        {
                return new Icebox();
        }
}

//创建空调的工厂
public class CreateAirCondition implements Factory
{
        public Product create()
        {
                return new AirCondition();
        }
}

 

         从上面创建产品对象的代码可以看出,工厂方法简单工厂 的主要区别是,简单工厂 是把创建产品的职能都放在一个类里面,而工厂方法 则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但工厂方法 也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用工厂方法 来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难.....

 

三. 抽象工厂(Abstract Factory)

        抽象工厂 :意的意图在于创建一系列互相关联或互相依赖的对象。<<Java设计模式>>
        抽象工厂 是在工厂方法 的基础上引进了分类管理的概念。工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点。

        我们继续用上面的例子来说明:工厂生产的所有产品都用都用大写字母来标明它们的型号,比如冰箱,就有“冰箱-A",“冰箱-B"。同样,其他的产品也都是遵守这个编号规则,于是就有了一下产品家族树:

产品树

             |
             |--冰箱
             |      |-- 冰箱-A
             |      |-- 冰箱-B

             |
             |--洗衣机
                    |-- 洗衣机-A
                    |--洗衣机-B

 

        我们可以为冰箱和洗衣机分别定义两个产品接口,以对他们进行分类:

//洗衣机接口
public interface Washer {}

//冰箱接口
public interface Icebox {}

         接着,我们分别创建这两个接口的具体产品:

//洗衣机-A
public class WasherA implements Washer
{
        public WasherA()
        {
                System.out.println("制造了一台洗衣机-A");
        }
}

//洗衣机-B
public class WasherB implements Washer
{
        public WasherB()
        {
                System.out.println("制造了一台洗衣机-B");
        }
}

//冰箱-A
public class IceboxA implements Icebox
{
        public IceboxA()
        {
                System.out.println("制造了一台冰箱-A");
        }
}

//冰箱-B
public class IceboxB implements Icebox
{
        public IceboxB()
        {
               System.out.println("制造了一台冰箱-B");
        }
}

        到此,产品部分我们准备好了,接下来我们来处理工厂部分,我们先来定义工厂行为接口:

public interface Factory
{
        public Washer createWasher();
        public Icebox createIcebox();
}

        接下来我创造具体的工厂类,我们根据上面产品的接口,把型号A的产品分为一类,由一个工厂来管理,把型号为B的产品有另一个工厂管理,根据这个分类,我们可以实现如下的两个具体工厂类:

//创建型号为A的产品工厂
public class FactoryA implements Factory
{        
         //创建洗衣机-A
        public Washer createWasher()
        {
                return new WasherA();
        }

        //创建冰箱-A
        public Icebox createIcebox()
        {
                return new IceboxA();
        }
}

//创建型号为B的产品工厂
public class FactoryB implements Factory
{
        //创建洗衣机-B
        public Washer createWasher()
        {
                return new WasherB();
        }

        //创建冰箱-B
        public Icebox createIcebox()
        {
                return new IceboxB();
        }
}

       这样,我们的抽象工厂就完成了。有上面可以看出,在运用上我觉得工厂方法和抽象工厂,都有自己的应用场景,并没有什么优劣之分,但在应用抽象工厂之前,要先对创建的对象进行系统的分类,这点很重要,好的产品分类规则能为具体工厂类的选择调用和以后的扩展提供清晰的思路。

 

 

  • 大小: 6.6 KB
分享到:
评论

相关推荐

    专题资料(2021-2022年)Java设计模式之工厂模式Factory.doc

    【Java设计模式之工厂模式Factory】是面向对象编程领域中常用的设计模式,它提供了一种创建对象的最佳方式。工厂模式的主要思想是将对象的创建过程封装起来,使得客户端(使用对象的代码)无需关心对象的具体创建...

    设计模式之Factory

    本篇文章将详细探讨"设计模式之Factory",它是一种非常基础且重要的创建型设计模式。 Factory模式的核心思想是提供一个接口或者抽象类,用于创建某一类对象,但允许其子类决定实例化哪一个类。这种模式使得创建过程...

    [创建型模式] head first 设计模式之工厂模式(Factory)

    工厂方法(Factory Method)是工厂模式的一种具体实现,它是《Head First 设计模式》这本书中讲解的重点之一。在这个模式中,一个工厂类声明了一个创建对象的抽象方法,但并不实现这个方法。而是由子类决定要实例化...

    C++的设计模式之工厂方法模式(Factory Method)

    C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)

    设计模式之工厂方法模式

    工厂方法模式是设计模式中的创建型模式之一,它在软件工程中扮演着非常重要的角色,尤其是在C#这样的面向对象编程语言中。工厂方法模式提供了一种封装对象创建过程的方法,使得具体的创建过程延迟到子类中进行,从而...

    深入浅出设计模式之工厂模式

    根据提供的标题“深入浅出设计模式之工厂模式”与描述“将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载”,我们可以推测出这部分内容主要关注的是设计模式中的工厂模式。...

    Java设计模式之工厂模式(Factory)

    ### Java设计模式之工厂模式详解 #### 一、引言 设计模式是在软件设计过程中针对常见问题而提出的标准化解决方案。其中,“工厂模式”是面向对象编程中最常用的模式之一,主要目的是封装实例化过程,使代码更加...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...

    走进设计模式之抽象工厂(Abstract Factory)

    总之,"走进设计模式之抽象工厂"这篇博客深入探讨了抽象工厂模式的原理、实现方式、应用场景及其优缺点,旨在帮助读者理解并有效地运用这一设计模式。通过阅读博客和分析提供的代码示例,开发者可以更好地掌握抽象...

    设计模式之工厂系列

    "设计模式之工厂系列"指的是几种不同的工厂模式,它们都是面向对象设计中的重要组成部分,尤其在Java编程语言中广泛使用。工厂模式的主要目标是提供一个创建对象的抽象接口,使得系统在不指定具体实现类的情况下,...

    Java设计模式之工厂模式(Factory).doc

    Java设计模式之工厂模式(Factory).doc

    Java设计模式之工厂模式(Factory模式)介绍

    **工厂模式**是一种常见的设计模式,它在Java中被广泛应用于创建对象实例。工厂模式的主要目的是将对象的创建过程封装起来,使得代码更加灵活且易于维护。通过使用工厂模式,我们可以将实例化对象的责任从客户端代码...

    设计模式之-工厂方法-FactoryMethod

    《设计模式之——工厂方法(Factory Method)》 在软件工程中,设计模式是一种解决常见问题的可重用解决方案,它被广泛应用于构建高质量、可维护的代码。工厂方法是面向对象设计模式的一种,属于创建型模式。这个...

    c++设计模式-工厂方法模式

    工厂方法模式是面向对象设计模式中的一个创建型模式,它提供了一种封装对象创建过程的方式,使得具体的对象创建过程可以延迟到子类中进行。在C++编程中,工厂方法模式广泛应用于各种软件设计中,因为它能有效地解耦...

    菜鸟教程设计模式之工厂模式代码整理

    在这个"菜鸟教程设计模式之工厂模式代码整理"中,我们将深入探讨工厂模式的基本概念、结构以及如何在实际编程中应用。 工厂模式的核心思想是通过一个专门的工厂类来创建对象,而不是让客户端代码直接实例化具体的...

    设计模式之-抽象工厂-AbstractFactory

    抽象工厂(Abstract Factory)设计模式是软件工程中一种重要的创建型设计模式,它提供了一种创建对象组的方式,这些对象属于同一族系并且彼此相关。这个模式的主要目标是定义一个接口,用于创建一族相关或相互依赖的...

    设计模式之工厂方法、简单工厂、抽象工厂

    这三种工厂模式的共同之处在于它们都为对象的创建提供了抽象层,隐藏了具体的实例化过程。然而,它们之间的区别在于灵活性和抽象程度: - 工厂方法模式提供了一种定义抽象接口的方法,让子类来决定具体实例化哪个类...

    设计模式之蝉

    还有“工厂模式”(Factory pattern),它是创建型设计模式之一,用于创建对象而不暴露创建逻辑给客户端,并且通过使用一个共同的接口来指向新创建的对象。这种模式在创建对象时提供了更高的灵活性和可扩展性。在...

Global site tag (gtag.js) - Google Analytics