`
liaobuzhisi
  • 浏览: 71395 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
文章分类
社区版块
存档分类
最新评论

图解+实例讲解java中设计模式中的简单工厂模式

阅读更多

简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出那一种产品类的实例。
1. 工厂模式的几种形态
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类
实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:
(1)简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern)。
(2)工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式;
(3)抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式。
下面就是简单工厂模式的简略类图。
简单工厂模式,或称静态工厂方法模式,是不同的工厂方法模式的一个特殊实现。在其他文献中,简单工厂往往作为普通工厂模式的一个特例讨论。
在Java语言中,通常的工厂方法模式不能通过设计功能的退化给出静态工厂方法模式。
因为一个方法是不是静态的,对于Java 语言来说是一个很大的区别,必须在一开始的时候就加以考虑。这就是本人将简单工厂单独提出来讨论的一个原因。学习简单工厂模式是对学习工厂方法模式的一个很好的准备,也是对学习其他模式的一个很好的准备。
2. 简单工厂模式的引进
简单工厂模式又叫静态工厂模式,顾名思义,它是用来实例化目标类的静态类。下面我主要通过一个简单的实例说明简单工厂及其优点。
现在我们通过一个例子看一下:
比如说有一个汽车公司,专门向市场销售各牌子的汽车。我们做一个相应的系统(例子):
首先我们把汽车堪称是一个接口注1,在这个接口里面有两个抽象方法—进货及卖(销售汽车)。然后根据需要去实现这个接口。


注1:在面向对象设计方法中有很多值得提倡的方法,这些方法可以为我们的设计带来很大的灵活性,可复用性。其中一个原则就是“针对接口编程,而不是针对实现编程” 。这个原则带来的好处有以下几点:

l       Client不必知道其使用对象的具体所属类。

l       Client无需知道特定类,只需知道他们所期望的接口。

l       一个对象可以很容易地被(实现了相同接口的)的另一个对象所替换。

l       对象间的连接不必硬绑定(hardwire)到一个具体类的对象上,因此增加了灵活性。

在接口完成(interface Car)了、汽车的概念已经出来以后,我们要去实现这个接口(根据我们想要销售的汽车类型,例如奔驰、福特、……等)。

这个时候,如果我们要销售奔驰车,就要在main方法(客户端)去实例化一个“class Benz”,并在客户端(main方法)中去实例化相关对象和调用对应的方法。

运行程序,正常。

这个时候如果我们想销售福特了,怎么办?这个时候我必须去修改客户端的程序(main方法),把Car c=new Benz();改成Car c=new Ford();。改动就有可能出错误,就要进行测试,……,这样显然对程序是不利的。我们应当怎样解决这个问题呢?


 
我们就想到,我们可以加一个工厂类,让这个工厂类为客户端实例化一个对象:


 

到目前为止,这个程序就是一个简单的工厂模式,但是这里还存在着一个问题:在我的客户端(main方法的地方),我需要即可以要Benz也可以要Ford,可以动态的去选择它,该怎么办呢?
这个时候我们就在想,我们可以把在class Factory中的getCarInstance()方法进行改进,让该方法可以接收参数,也就是说,客户端想要什么,我的工厂就按照客户端的要求去提供,首先对class Factory中的getCarInstance()进行改进,然后客户端程序也做相应的调整:

 

 


运行正常。但是现在还有问题:在传递参数的时候只能传入Benz或者Ford,如果传入其它参数就会出问题,怎么办呢?应当在客户端这里加一个判断,看Factory.getCarInstance(“Benz”);返回的参数是不是“空”的:


现在又有一个问题,如果我们不仅卖奔驰和福特,我们还卖别的牌子的汽车,也就是说如果我们现在要扩充一个子类,就必须去修改“工厂”(class Factory),在“工厂”中在添加一个if去判断并去实例化相应的子类,例如我们想要销售丰田汽车,就必须修改“工厂”。怎样解决这个问题呢?
我们现在要解决的问题是,扩充子类,怎样不用去修改工厂:如果是用java语言来实现的话,我们自然会想到利用java的反射机制注2 ,
注2:java的反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
用java的反射机制解决这个问题,那么在“工厂”中就不用if判断了,

 

 

这个时候在客户端的Car c=Factory.getCarInstance(“Benz”);中无论是输入Benz还是输入Ford都会等到正确的运行结果。完整的程序如下:

package org.chenb.factorydemo;

 

interface Car{

    public void stock();

    public void sell();

}

 

class Benz implements Car{

    public void stock(){

        System.out.println("Benz进货了………");

    }

    public void sell(){

        System.out.println("Benz卖出了………");

    }

}

class Ford implements Car{

    public void stock(){

        System.out.println("Ford进货了………");

    }

    public void sell(){

        System.out.println("Ford卖出了………");

    }

}

 

class Factory{

    public static Car getCarInstance(String type){

        Car c=null;

        try {

              c=(Car)Class.forName("org.chenb.factorydemo."+type).newInstance();

        } catch (InstantiationException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

        } catch (IllegalAccessException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

        } catch (ClassNotFoundException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

        }

   

        return c;

    }

}

public class FactoryDemo {

 

    public static void main(String[] args) {

        Car c=Factory.getCarInstance("Benz");

        if(c!=null){

              c.stock();

              c.sell();

        }else{

              System.out.println("无此类型的汽车销售……");

        }

       

    }

 

}

 

这个时候,如果我们添加一个子类,比如我们除销售奔驰、福特以外,还要销售丰田、奇瑞,就不需要去修改工厂了,只要去添加一个子类即可,例如我们要销售丰田汽车了,就添加一个子类Toyota去实现汽车接口:

class Toyota implements Car{

    public void stock(){

        System.out.println("Toyota进货了………");

    }

    public void sell(){

        System.out.println("Toyota卖出了………");

    }

}

在客户端的Car c=Factory.getCarInstance(“Toyota”);中输入Toyota即可。
其实这也实现了面对对象设计的一个很重要的原则—开闭原则(OCP),即一个软件实体应当对扩展开放,对修改关闭。

本文来自: IT知道网(http://www.itwis.com) 详细出处参考:http://www.itwis.com/html/software/aa/20080922/2455_2.html

分享到:
评论

相关推荐

    Java设计模式(图解+框架源码分析+实战)- 黑马课件

    本课程基于黑马程序员提供的课件,通过图解、框架源码分析及实战的方式,深入浅出地讲解了Java设计模式的核心知识。 在Java设计模式的学习过程中,通常会涉及到以下几个方面: 1. **单例模式**:确保一个类只有一...

    图解Java设计模式笔记总结word版本.rar

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可重用性、可维护性和灵活性。本资料“图解Java设计模式笔记总结word版本”聚焦于通过图文并茂的方式,深入浅出地解析...

    尚硅谷_韩顺平_图解Java设计模式

    《尚硅谷_韩顺平_图解Java设计模式》是一份详尽的Java设计模式学习资料,由知名教育机构尚硅谷的讲师韩顺平精心编撰。这份笔记全面覆盖了设计模式的重要概念、应用场景以及实战技巧,是Java开发者学习和复习设计模式...

    韩顺平_Java设计模式笔记.docx

    Java设计模式笔记.docx》的总结和分析,该笔记涵盖了 Java 设计模式的基础知识、设计模式的七大原则、原型设计模式、解释器设计模式、单例设计模式等内容,并对每个设计模式的原理、实现步骤、代码实现和实际应用...

    GoF23种经典模式+简单工厂模式讲解还有一篇心得

    在IT行业中,设计模式是软件开发中的重要概念,它们代表了在特定情境下解决常见问题的最佳实践。"GoF23种经典模式"指的是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位专家在1994年出版的《设计...

    韩顺平_java设计模式笔记

    韩顺平老师的Java设计模式课程通过生活中的实例和Spring框架中的应用,深入浅出地讲解了这些模式。 首先,我们来看一下原型设计模式。原型模式主要用于对象的复制,分为浅拷贝和深拷贝。浅拷贝只复制对象的引用,而...

    java23种设计模式,3套视频加1个ppt

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可重用性、灵活性和可维护性。23种设计模式被广泛接受并分类为三大类:创建型模式(Creational Patterns)、结构型...

    java设计模式资料汇总

    首先,"Java设计模式-图解-附代码.doc"文档可能包含了一些常见的设计模式,如单例模式、工厂模式、观察者模式等,通过图文并茂的方式进行解释,并提供了实际的Java代码示例。这些模式都是在面向对象编程中经常遇到的...

    _图解Java设计模式.zip

    《图解Java设计模式》是一本深入探讨Java编程中设计模式的书籍,它以其独特的图解方式,使得复杂的概念变得更加直观易懂。本书的核心内容涵盖了Java设计模式的多个方面,包括六大设计原则以及具体的实现模式。以下是...

    java部分设计模式

    本资源包含部分设计模式的详细讲解,辅以图解和实例,旨在帮助开发者更好地理解和运用这些模式。 1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于配置中心、线程池等...

    图解java多线程设计模式-结城浩-完整高清带书签版本

    这本书以清晰易懂的方式,结合丰富的图表和实例,全面解析了Java多线程开发中的关键概念、设计模式以及实践技巧。在Java编程领域,多线程是不可或缺的一部分,它能提升程序的执行效率,实现并发操作,但同时也带来了...

    设计模式详细讲解(网页版)

    在本资料中,通过实例讲解了设计模式,使得学习者能够更直观地理解和应用这些模式。 首先,我们来讨论"图说设计模式 — Graphic Design Patterns.htm"这个文件可能涵盖的内容。这个文件很可能以图文并茂的方式介绍...

    JAVA多线程设计模式

    本书《JAVA多线程设计模式》针对Java语言的多线程编程进行深入讲解,采用易于理解的方式介绍了与Java线程相关的多个设计模式,并通过实例程序与UML图示辅助阐述。书中的关键代码片段都有标注,易于读者理解与学习,...

    head first 设计模式 中文版带书签

    书中包含了大量实例和图解,帮助读者更好地理解每种设计模式的应用场景和实现细节。此外,《Head First设计模式》还强调了实际编码过程中的实践技巧,非常适合初学者和有一定经验的开发人员学习。 ### 四、学习设计...

    Java多线程设计模式详解

    综上所述,这本书是一本深入讲解Java多线程设计模式的参考书,通过实例和图解帮助读者掌握多线程编程的核心概念,对于初学者和有经验的程序员都是一本不可多得的学习材料。尽管存在一些扫描不清的问题,但其内容质量...

    HeadFirst设计模式源码(部分)

    《HeadFirst设计模式》是一本深受开发者喜爱的设计模式学习书籍,以其独特的教学方式,通过丰富的图解和幽默的语言,使得复杂的设计模式概念变得易于理解。这里我们拥有的是该书部分源码,这些代码是为了配合书中...

    Head First Java 中文高清版

    书中可能会讲解一些常见的设计模式,如工厂模式(Factory)、单例模式(Singleton)、观察者模式(Observer)、装饰器模式(Decorator)和策略模式(Strategy)等。这些模式都是解决特定问题的模板,如如何创建对象...

    Head.First设计模式_PDF.rar

    1-21.pdf章节可能会讲解简单工厂、工厂方法和抽象工厂模式的区别和应用。 3. **观察者模式(Observer)**:定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。...

    深入浅出之[Head First 设计模式]

    在《深入浅出之[Head First 设计模式]》中,作者通过生动的图解、有趣的比喻和互动性强的示例,使读者能够轻松掌握各种设计模式的精髓。书中不仅讲解了每个模式的基本原理,还提供了实际应用场景,让读者能够直观地...

Global site tag (gtag.js) - Google Analytics