`
Ivan_Pig
  • 浏览: 387139 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

DesignPattern学习-----对Factory的迷惑

阅读更多
    我对工厂不明白的地方就是工厂方法和抽象工厂之间到底有什么区别。

    对于简单工厂深入浅出DesignPattern说,简单工厂不算是个设计模式,只算个写法。不过照这样推论,其实所有的设计模式都是一种写法罢了。

    工厂方法模式定义了一个创建对象的接口,但由子类决定实例化的类是哪个。工厂方法让类把实例化推迟到了子类。(这句话我看了n遍,就是没看明白!说得莫名其妙的)

    再看抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 (更是莫名其妙!)

    看下代码。工厂方法。
   
//产品 Plant接口 
public interface Plant { } 
//具体产品PlantA,PlantB 
public class PlantA implements Plant {  
  public PlantA () {   
    System.out.println("create PlantA !");  
  }  
  public void doSomething() {   
    System.out.println(" PlantA do something ...");  
  } 
} 
public class PlantB implements Plant {  
  public PlantB () {   
    System.out.println("create PlantB !");  
  }  
  public void doSomething() {   
    System.out.println(" PlantB do something ...");  
  } 
} 
// 抽象工厂方法 
public interface AbstractFactory {  
  public Plant createPlant(); 
} 
//具体工厂方法 
public class FactoryA implements AbstractFactory {  
  public Plant createPlant() {   
    return new PlantA();  
  } 
} 
public class FactoryB implements AbstractFactory {  
  public Plant createPlant() {   
    return new PlantB();  
  } 
} 
//调用工厂方法 
public Client { 
  public method1() {
    AbstractFactory instanceA = new FactoryA(); 
    instanceA.createPlant();
    AbstractFactory instanceB = new FactoryB(); 
    instanceB.createPlant();
  } 
}


    再看抽象工厂。
// 产品 Plant接口    
public interface Plant { }//标志接口  
//具体产品PlantA,PlantB    
public class PlantA implements Plant {    
  
 public PlantA () {    
  System.out.println("create PlantA !");    
 }    
  
 public void doSomething() {    
  System.out.println(" PlantA do something ...");    
 }    
}    
public class PlantB implements Plant {    
 public PlantB () {    
  System.out.println("create PlantB !");    
 }    
  
 public void doSomething() {    
  System.out.println(" PlantB do something ...");    
 }    
}    
// 产品 Fruit接口    
public interface Fruit { }    
//具体产品FruitA,FruitB    
public class FruitA implements Fruit {    
 public FruitA() {    
  System.out.println("create FruitA !");    
 }    
 public void doSomething() {    
  System.out.println(" FruitA do something ...");    
 }    
}    
public class FruitB implements Fruit {    
 public FruitB() {    
  System.out.println("create FruitB !");    
 }    
 public void doSomething() {    
  System.out.println(" FruitB do something ...");    
 }    
}    
// 抽象工厂方法    
public interface AbstractFactory {    
 public Plant createPlant();    
 public Fruit createFruit();    
}    
//具体工厂方法    
public class FactoryA implements AbstractFactory {    
 public Plant createPlant() {    
  return new PlantA();    
 }    
 public Fruit createFruit() {    
  return new FruitA();    
 }    
}    
public class FactoryB implements AbstractFactory {    
 public Plant createPlant() {    
  return new PlantB();    
 }    
 public Fruit createFruit() {    
  return new FruitB();    
 }    
}   


    区别在哪里?和明显,
(1)第二段代码比第一段代码多了一个接口及相应的实现类。
(2)且这个方法能同时创建多个对象。除了工厂方法里面的createPlant(),还有ceateFruit()。
其他,好像没区别了吧?

     这么相近的模式,干嘛非要解释成这样?!
     我对抽象工厂这么描述行不行?
     抽象工厂模式定义了一个创建多个相关联或相互依赖对象的接口,但由子类决定实例化的类是哪个。
     或者我对工厂方法这么描述行不行?
     工厂方法,提供一个创建一个对象的接口,而无需指定它们具体的类。
     这么描述,看了以后应该还是很迷惑,但是你了解了其中一个模式后,就能知道另一个模式的概样了,而不会像接触一个完全陌生的模式那样迷茫了。

     从简单工厂,到工厂方法,再到抽象工厂,应该是一个逐步添加功能的过程。
     简单工厂:只有一个工厂,只能实例化一种对象。
     工厂方法:一个抽象工厂,派生多个具体工厂,而每个具体工厂只能实例化一种对象。
     抽象工厂:一个抽象工厂,派生多个具体工厂,每个具体工厂还能实例化多种对象。

     现在,个人认为自己终于对工厂有了一个认识,至少不迷茫了。很郁闷,干嘛喜欢用这么让人郁闷的语句,解释原来挺简单的东西。


参考文章及代码来源:http://ldjsyl.iteye.com/blog/178177
http://ldjsyl.iteye.com/blog/184640
2
0
分享到:
评论
1 楼 airu 2009-02-12  
抽象是关键。
抽象工厂还可以继续抽象。
多思考很有意思。

相关推荐

    design-pattern-java.pdf

    Factory Method Pattern 工厂三兄弟之工厂方法模式(一) 工厂三兄弟之工厂方法模式(二) 工厂三兄弟之工厂方法模式(三) 工厂三兄弟之工厂方法模式(四) 抽象工厂模式-Abstract Factory Pattern 工厂三兄弟之...

    Design pattern In JavaScrip-design-pattern-in-javascript.zip

    "Design pattern In JavaScript"这个主题涵盖了一系列广泛使用的模式,这些模式可以分为三大类:创建型、结构型和行为型。 1. **创建型模式**: - **工厂模式**:它提供了一种创建对象的接口,但允许子类决定实例...

    design-pattern-java

    个人觉得这本书介绍的设计模式知识比较通俗易懂

    design-pattern-java.rar

    本资料《design-pattern-java.rar》包含了一份详细的PDF文档,旨在深入解析Java中的设计模式。 首先,我们要了解什么是设计模式。设计模式并不具体指某段代码,而是描述在特定情况下如何设计类和对象,以达到良好的...

    design-pattern-factory-method:design-pattern-factory-method:Código-exemplopara ilustrar oPadrãode Projeto Factory Method

    在给定的标题“design-pattern-factory-method:Código-exemplopara ilustrar o Padrão de Projeto Factory Method”中,我们关注的是工厂方法(Factory Method)设计模式。这是一种创建型设计模式,它定义了一个...

    DesignPattern-master_designpattern_powerful854_

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题,...在DesignPattern-master这个压缩包中,你可能找到每种模式的实例代码、示例、解释和使用场景,对于深入学习和实践设计模式非常有帮助。

    java-design-patterns-master_JAVAdesignpattens_java_design_

    这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在帮助开发者深入理解和应用这些模式。下面我们将详细探讨Java设计模式及其在实际开发中的应用。 1. **单例模式(Singleton...

    Design-For-Test For Digital IC's and Embedded Core Systems

    通过学习《Design-For-Test For Digital IC's and Embedded Core Systems》,读者将能够掌握先进的DFT技术,理解如何在设计阶段优化IC和嵌入式系统的测试流程,从而提升产品质量,降低生产成本。这本书对于任何致力...

    design pattern - adapter

    课程作业,adapter pattern基本演示

    MaterialDesign-Webfont-master.zip

    MaterialDesign-Webfont-master.zip 是一个包含Material Design Webfont资源的压缩包,旨在帮助开发者轻松地在网页项目中集成Material Design风格的图标。Material Design是由Google推出的一种现代化、统一的设计...

    JAVA design pattern-java设计模式

    总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。

    laowang-hahaha-design_pattern-master.zip

    这个名为"laowang-hahaha-design_pattern-master.zip"的压缩包很可能包含了一个关于设计模式的示例项目,主要用于教学和学习。它特别强调使用三种设计模式来构建一个系统,这为学习者提供了一个实际操作的平台,帮助...

    Design Pattern - Elements of Reusable Object Oriented Software

    when it can be applied in view of other design constraints, and the consequences and trade-offs of using the pattern within a larger design. All patterns are compiled from real systems and are based ...

    golang design pattern; 设计模式golang版本-go-design-patterns.zip

    在编程领域,设计模式是一种被广泛接受的解决常见问题的最佳实践。它们是经过时间验证的...在"go-design-patterns-master"这个项目中,你将找到每个模式的具体实现示例,这对于学习和理解Go语言的设计模式非常有帮助。

    DesignPattern-master.zip

    "DesignPattern-master.zip"这个压缩包很可能包含了一个关于设计模式的项目或教程资源,用于学习和理解各种设计模式。 在这个“DesignPattern-master”目录中,我们可以期待找到不同类型的资源,如源代码示例、解释...

    ant-design-pro-master

    总的来说,"ant-design-pro-master"是一个绝佳的学习资源,它可以帮助你掌握Ant Design Pro和ES6的应用,理解企业级前端开发的最佳实践,无论你是初学者还是有一定经验的开发者,都能从中受益匪浅。通过深入研究这个...

    design-pattern

    ##### 3.1 简单工厂模式 (Simple Factory Pattern) 简单工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。该模式适用于当一个系统只需要提供一个产品族中的一个实例时。 1. **工厂...

    设计模式(Design Pattern).xmind

    设计模式(Design Pattern)思维导图,详细整理,展开页含很多详细比较,希望能帮到更多的人

    Design of Sigma-Delta Converters in MATLAB®_Simulink®

    Author(s): Isacco Arnaldi Publisher: Springer International Publishing, Year: 2019 ISBN: 978-3-319-91538-8,978-3-319-91539-5

    Optimum-Receiver-Design-for-OFDM-Based-Broadband-Transmission

    在第一部分"Optimum-Receiver-Design-for-OFDM-Based-Broadband-Transmission—Part-I.pdf"中,作者首先介绍了OFDM的基本原理和工作机制。OFDM通过将高速数据流分解成多个较低速率的数据流,并在多个正交子载波上...

Global site tag (gtag.js) - Google Analytics