`
df20070608
  • 浏览: 30228 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

常用设计模式之:工厂模式

阅读更多

假设有一个接口Fruit,Apple、Orange等类均实现该接口,当我们想创建一个Apple的对象时,我们通常写下:
Fruit apple=new Apple();
再想创建Orange对象时,我们又要写:
Fruit orange=new Orange();
当我们想要创建其他所需的Fruit实现类时,我们必须自己再写一条条的new语句,甚至要对之前的一些代码作修改,工厂模式就为解决这一问题而生,通常它会定义一个创建产品的工厂接口,将实际的创建工作推迟到子类中!

 

工厂模式包括简单工厂模式工厂方法模式抽象工厂模式

 

 

简单工厂模式


在这种模式中,有一个Factory类,它有一个getIns方法,每次根据传入的参数来创建对象。

比如:
class Factory{
  public static Fruit getIns(String type){
    if(type.equals("apple")){
        return new Apple();
    }
    esle if(type.equals("orange")){
       return new Orange();
    }else{
       return null;
    }
  }

}
这样,我们创建对象时只需要:

 

//创建Apple类对象
Fruit instance01=Factory.getIns("apple");

//创建Orange类对象
Fruit instance02=Factory.getIns("orange");


这样所有的对象创建均由Factory来处理,方便管理对象创建。同时依据传入的参数来创建对象,使程序有了一定的动态性,但是这种方法的缺点也还是很明显的,比如要新加一个Pear类,那么就需要对getIns(String type)方法进行修改,新加一个if else语句,每新加一个Fruit实现类时,就要修改一次,这样代码之间耦合度还是很高,目前抽象工厂模式已经很少使用了。

 

工厂方法模式:

 

 

 

这种模式在这三种模式中使用最为频繁,大家熟知的MVC框架通常就采用了工厂方法。

 

 


该模式可以看作对简单工厂模式的扩展,它进一步将工厂类抽象出来,得到一个工厂接口,每一个待创建的类都有一个自己的工厂类。用该方法对上述例子进行改进:

 

首先创建工厂接口:
interface Factory{
   public Fruit getIns();
}

 

每种产品有一个实现工厂接口的工厂类:

class AppleFactory implements Factory{
   public Fruit getIns(){
      return new Apple();
   }
}

 

class OrangeFactory implements Factory{
   public Fruit getIns(){
      return new Orange();
   }
}


这时,创建一个产品对象时,我们需要先创建相应的工厂类:


//创建Apple类对象

Factory factory=new AppleFactory();
Fruit instance01=factory.getIns();

 

//创建Orange类对象

factory=new OrangeFactory();
Fruit instance02=factory.getIns();

 

代码量确实增加了,但是值得注意的是:现在添加一个新的水果类时,对之前的代码不需做任何修改,只要增加实现Fruit接口的类与相应的工厂类即可。从高内聚低耦合角度来看,每个工厂类只负责生成相应的水果类,这属于高内聚,而不同类之间不互相影响,添加一个类或删除一个类,不需对其他类做任何修改,不同类之间几乎没有联系,这属于低耦合!并且符合“开-闭”原则(开闭原则要求能对软件进行功能扩展,并不应修改原有的代码。)


在MVC中,由于加入了反射技术,不用再写工厂类,使得代码更加简洁,但在此不作相关说明!

 

抽象工厂模式:

 

 

在讲解该模式之前,先来看一个概念:

 

产品族。
所谓产品族就是指:是以产品平台为基础,通过添加不同的个性模块,以满足不同客户个性化需求的一组相关产品(百度百科的定义),简单来说就是位于不同产品等级但功能相关联的产品组成的家族,比如sony的mp3与耳机是一个产品族,oppo的mp3与耳机也是一个产品族,mp3与耳机是不同等级的而功能相关的产品!

 

抽象工厂主要就应用于当系统提供多个产品族,而只需要使用其中一个产品族。

 

以产品族中提到的sony与oppo为例,采用抽象工厂方法来实现:

首先应为每种类型的产品设计接口

interface Mp3{
 ……
}

interface Headset{
 ……
}

为各个产品设计产品类

class SonyMp3 implements Mp3{
 ……
}
class SonyHeadset implements Headset{
 ……
}
class OppoMp3 implements Mp3{
 ……
}
class OppoHeadset implements Headset{
 ……
}
设计工厂接口:

interface Factory{
 public Mp3 getMp3Ins();
 public Headset getHeadsetIns();
}
让各个公司的工厂类实现工厂接口

class SonyFactory implements Factory{
 public Mp3 getMp3Ins(){
  return new SonyMp3();
 }
 public Headset getHeadsetIns(){
  return new SonyHeadset();
 }
}

class SonyFactory implements Factory{
 public Mp3 getMp3Ins(){
  return new OppoMp3();
 }
 public Headset getHeadsetIns(){
  return new OppoHeadset();
 }
}

有人看到这,也许会觉得很眼熟,甚至想当然的认为抽象工厂方法就是多个工厂方法的集合,那就在这将二者对比一下:

多个工厂方法中的产品是相互平行的,没有关系的,或者即使有关系但在设计中不必考虑,而抽象工厂中,主要面向的产品族,产品族的产品属于不同的产品等级,但又相互依存的,并且在抽象工厂模式中应体现出这种关系!理解产品族的概念,是理解抽象工厂关键。

 

抽象工厂方法很适合于应对“系列”的变更,但在难以应对“对象”的变更。比如在上述例子中有sony和oppo两家公司,这时想新加一个也是生产mp3和耳机的公司,只需让该公司实现工厂接口,公司产品实现各产品接口,之前的代码不需变更。而这时,这些公司突然想增加一种产品(比如:手机),他们必须了解手机的相关标准,然后设计自己品牌的手机,这时还产生什么影响,但手机设计出来后要投入生产,于是要在工厂内加入手机生产线,之前的工厂标准是能生产mp3和耳机,不符合现在要求,所以工厂的标准和各个公司的工厂都需修改!

1
1
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    探索Java设计模式:工厂模式与抽象工厂模式的比较

    工厂模式和抽象工厂模式是两种常用的创建型设计模式,它们在Java中有着广泛的应用。本文将详细探讨这两种模式的区别,并提供代码示例来加深理解。 工厂模式和抽象工厂模式都是创建型设计模式,它们提供了代码解耦和...

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式是一种常用的软件设计模式,它是创建型设计模式的一种,主要解决对象的创建问题,将对象的创建过程封装起来,使得创建过程独立于使用过程。这样可以提高代码的可复用性和灵活性,同时降低了系统的耦合度。...

    java常用设计模式-抽象工厂模式

    java常用设计模式-抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建...

    java常用23中设计模式

    总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    常用设计模式特点比如工厂模式、单例模式等等

    1. 工厂模式: 工厂模式是一种对象创建型设计模式,它提供了一种创建对象的最佳方式,通过将实例化过程封装在单独的工厂类中,使得客户端代码无需知道具体创建的对象类型。这样做的好处包括提高代码的灵活性、可扩展...

    c#几种常用的设计模式

    以下是对标题和描述中提到的几种常用C#设计模式的详细解释: 1. **单例模式(Singleton)**: - 单例模式确保一个类只有一个实例,并提供全局访问点。在C#中,通常通过私有化构造函数和静态成员来实现。这样可以...

    设计模式之工厂方法模式

    总结,工厂方法模式在C#编程中是一种常用的设计模式,它提供了创建对象的灵活方式,使得代码更加易于扩展和维护。在实际项目中,我们可以通过合理运用工厂方法模式,提高代码的可读性和可维护性,同时减少因为直接...

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

    "设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...

    python 项目里常用的设计模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式 简单工厂 建造者模式 模板模式

    python 项目里常用的设计模式 单例模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式简单工厂 建造者模式 模板模式 桥接多维度 桥接模式 适配器模式 外观模式 享元模式 责任链组合模式

    设计模式之工厂

    在这个主题下,我们将深入探讨三种主要的工厂模式:简单工厂、工厂方法和抽象工厂。 1. **简单工厂模式**: 简单工厂模式是最基础的形式,它定义了一个公共接口来创建对象,但让子类决定实例化哪一个类。这种模式...

    设计模式:01工厂模式-labview实现

    工厂模式是其中最常用的一种创建型设计模式,它的核心思想是提供一个接口或抽象类,用于创建相关或依赖对象的家族,而无需指定它们的具体类。在“设计模式:01工厂模式-labview实现”这个主题中,我们将深入探讨如何...

    设计模式之java工厂模式

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

    《设计模式:可复用面向对象软件的基础》英文版

    《设计模式:可复用面向对象软件的基础》是一本由Erich Gamma、Richard Helm等四位国际知名的软件工程师共同编写的经典之作,该书提供了面向对象软件设计中常用的模式,并通过具体的案例解释了这些模式如何帮助解决...

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

    工厂模式是一种常用的面向对象设计模式,属于创建型模式之一。它的主要目的是为了解决在软件开发过程中频繁创建对象的问题,并提供了一种更加灵活的方式来创建对象。 #### 1.2 特点 - **封装性**:通过将对象的创建...

    Jjava常用设计模式

    在这个Java常用设计模式的文档中,我们将深入探讨以下几种模式:单例模式、工厂模式、策略模式以及观察者模式。 **单例模式**是一种限制类实例化次数的模式,确保一个类只有一个实例,并提供一个全局访问点。在Java...

    常用设计模式及Java程序 pdf

    ### 常用设计模式及Java程序设计 #### 设计模式概述 设计模式是一种软件设计领域中的通用解决方案,用于描述解决常见设计问题的最佳实践。它不仅有助于提高代码的复用性和可读性,还能增强软件架构的灵活性和扩展...

    常用设计模式demo代码-design.rar

    根据描述,这里有三种工厂模式: - **简单工厂模式**:通过一个中心工厂类创建不同类型的对象,工厂类知道如何创建所有相关的产品。 - **工厂方法模式**:将对象的创建过程委托给子类决定,每个子类可以实现自己的...

    Java常用设计模式

    以下是关于标题和描述中提到的Java常用设计模式的详细解释: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在Java中,通常通过私有构造器和静态工厂方法实现。双检锁(Double-Check Locking)...

    java中常用设计模式总结心得

    以下是对Java中常用设计模式的详细解释: 1. **单例模式**:单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于配置管理、线程池或者数据库连接池等场景。实现方式有懒汉式(线程不安全)、...

Global site tag (gtag.js) - Google Analytics