`
ideal46
  • 浏览: 30175 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

工厂方法

阅读更多
定义:提供抽象方法或者接口,让子类或者实现类根据情况或者给定参数决定哪些类类或者方法应该被实例化或者被调用。

使用及优点:
  • 连接平行的类层次结构
  • 一个希望子类指定对象的类
  • 一个类无法预料他的子类时必须被创建
  • 通过使用共享接口来分开对象家庭
  • 该代码是需要处理的接口,而不是实现了的类
  • 对客户端隐藏具体的类
  • 工厂方法可以被参数化
  • 放回的对象可以是抽象类的也可以是具体类
  • 提供钩子给子类比直接创建对象更灵活
  • 遵守命名规则以帮助其他开发者认识代码结构
  • 相关模式:
  •         抽象工厂: 比工厂方法高一层
            模板方法: 他定义了一个算法的骨架让子类遵守或者避免子类
            原型:    他通过拷贝实例创建新对象,因此他可以减少子类
            单例:    他可以让返回的工厂方法唯一


例子:为了理解这个概念,让我们一起看一些简单的例子。

interface Shape {
   public void draw();
}
class Line implements Shape {
    Point x, y;
    Line(Point a, Point b) {
       x = a;
       y = b;
    }
    public void draw() {
       //draw a line; 
    }
}
class Square implements Shape {
    Point start;
    int width, height;
    Square(Point s, int w, int h) {
        start = s;
        width = w;
        height = h;
    }
    public void draw() {
       //draw a square;
    }
}
class Circle implements Shape {
    ....
}

class Painting {
   Point x, y;
   int width, height, radius;
   Painting(Point a, Point b, int w, int h, int r) {
       x = a;
       y = b;
       width = w;
       height = h;
       radius = r;
   }
   Shape drawLine() {
       return new Line(x,y);
   }
   Shape drawSquare() {
       return new Square(x, width, height);
   }
   Shape drawCircle() {
       return new Circle(x, radius);
   }
   ....
}

...
Shape pic;
Painting pt;
//initializing pt 
....
if (line) 
   pic = pt.drawLine();
if (square)
   pic = pt.drawSquare();
if (circle)
   pic = pt.drawCircle();


从上边的例子,你可以看到Shape中pic的类型依赖于给定的条件,可能是一条线,一个矩形或者一个圆形。

我们需要更多的构造器,从而根据不同的参数来实例化更多需要的对象。这是另外一种工厂设计方法。
class Painting {
   ...
   Painting(Point a, Point b) {
      new Line(a, b); //draw a line
   }
   Painting(Point a, int w, int h) {
      new Square(a, w, h); //draw a square
   }
   Painting(Point a, int r){
      new Circle(a, r); //draw a circle
   }
   ...
}

你需要一些方法来完成绘画工作,这就是所谓的工厂方法模式。

class Painting {
   ...
   Painting(Point a, Point b) {
      draw(a, b); //draw a line
   }
   Painting(Point a, int w, int h) {
      draw(a, w, h); //draw a square
   }
   Painting(Point a, int r){
      draw(a, r); //draw a circle
   }
   ...
}



上边draw()被重载。

这里有一个很流行的工厂设计模式的例子,例如,你有许多不同位置的数据库,基于数据库的程序是一样的,用户仅仅需要选择本地或者远程模式,这样你就需要将程序设计成工厂模式。当用户选择本地模式,你需要实例化工作在本地数据库的实例,如果选择远程数据库,你就需要创建可能做更多事情的远程实例。
interface DatabaseService {
    public DataInfo getDataInfo() throws Exception;
    public FieldInfo getFieldInfo() throws Exception;
    public void write(FieldInfo fi) throws Exception;
    public void modify(FieldInfo fi) throws Exception;
    public void delete(FieldInfo fi) throws Exception;
    //...
}
class Data implements DatabaseService {
    
    public Data(String fileName) {...};
    public Data(URL url, String fileName) {....};
    public DataInfo getDataInfo() throws Exception {...};
    public FieldInfo getFieldInfo() throws Exception {...};
    public void write(FieldInfo fi) throws Exception {...};
    public void modify(FieldInfo fi) throws Exception {...};
    public void delete(FieldInfo fi) throws Exception {...};
    //....
}
class DataManager{
   Data data = null;
   ...
   if (local) {
      data = new Data(localFile);  
      ...
   }
   if (remote){
      data = new Data(connectRemote, databaseFile);
      ...
   }
   data.write(someInfo);
   data.modify(someInfo);
   ....
}



为了说明如何使用类层次实现工厂模式,给出一个实际例子。一个公司有一个需要需要显示来自文本文件的测试结果,可是最近公司购进一台新机器,它产生二进制数据文件,其他类似产生其他格式数据文件的机器也在不断购进,那怎样处理这种改变那?因为站点仅仅需要显示数据,所以我们的工作就是提供给站点需要的数据格式。下边是一个解决方案,使用接口类型来汇集不同数据文件格式,下边是一种实现骨架。
//Let's say the interface is Display
interface Display {

   //load a file
   public void load(String fileName);

   //parse the file and make a consistent data type
   public void formatConsistency();

}

//deal with plain text file
class CSVFile implements Display{

    public void load(String textfile) {
        System.out.println("load from a txt file");
    }
    public void formatConsistency() {
        System.out.println("txt file format changed");
    } 
}

//deal with XML format file
class XMLFile implements Display {

    public void load(String xmlfile) {
        System.out.println("load from an xml file");
    }
    public void formatConsistency() {
        System.out.println("xml file format changed");
    } 
}

//deal with binary format file
class DBFile implements Display {

    public  void load(String dbfile) {
        System.out.println("load from a db file");
    }
    public void formatConsistency() {
        System.out.println("db file format changed");
    } 
}

//Test the functionality
class TestFactory {

    public static void main(String[] args) {
        Display display = null;
        
        //use a command line data as a trigger
        if (args[0].equals("1"))
           display = new CSVFile();
        else if (args[0].equals("2"))
           display = new XMLFile();
        else if (args[0].equals("3"))
           display = new DBFile();
        else
           System.exit(1);

        //converging code follows
        display.load("");
        display.formatConsistency();
   }    
}


将来,公司可能会添加更多的不同格式的数据文件,不过咱们的程序就只需要按照规则添加一个新类,这种设计节省了很多代码并且易于维护。
0
0
分享到:
评论

相关推荐

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

    工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    工厂方法模式和抽象工厂模式的区别

    工厂方法模式和抽象工厂模式是两种常见的设计模式,它们都属于创建型模式,用于解决对象的创建问题。在软件设计中,这两种模式都是用来隔离对象的创建和使用,以提高系统的灵活性和可扩展性。 首先,工厂方法模式的...

    简单工厂-工厂方法-抽象工厂 对比总结

    本篇文章将对三种主要的工厂模式:简单工厂、工厂方法和抽象工厂进行深入的对比和总结。 **简单工厂模式** 是最基础的工厂模式形式,它提供一个静态方法或类来创建对象。在这个模式中,工厂是负责创建对象的中心...

    工厂方法模式的C语言实现

    工厂方法模式是一种设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,当我们创建对象时,不会直接实例化具体的产品类,而是通过一个工厂类来创建。这样做的好处是,当需要添加新的产品...

    软件设计之工厂方法模式,源代码

    ### 软件设计之工厂方法模式解析及Java实现 #### 一、工厂方法模式概述 工厂方法模式(Factory Method Pattern)是一种常用的面向对象设计模式,属于创建型模式之一。它提供了一种创建对象的最佳方式。在工厂方法...

    工厂方法模式uml类图

    java设计模式 工厂方法模式uml类图,一张图就让你秒懂工厂方法模式

    设计模式-工厂方法模式

    工厂方法模式是设计模式中的创建型模式,它提供了一种创建对象的最佳方式。在这个模式中,一个类(称为工厂类)不再直接实例化具体的产品,而是定义一个接口或抽象类,由子类来决定实例化哪一个类。这样做的好处在于...

    用工厂方法模式重构简易计算器 源代码+实验报告

    《工厂方法模式在简易计算器重构中的应用》 在软件工程中,设计模式是解决常见问题的模板,它们为程序员提供了一种标准化的解决方案。工厂方法模式(Factory Method Pattern)是面向对象设计模式的一种,它在实际...

    设计模式之工厂方法

    这个接口就是工厂方法,让子类决定实例化哪一个类,工厂方法让类的实例化推迟到子类。 在Java编程中,工厂方法模式通常涉及到以下几个关键角色: 1. 抽象产品(Abstract Product):这是产品的抽象接口,定义了产品...

    工厂方法模式代码示例

    工厂方法模式是一种面向对象的设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 工厂方法模式的核心思想是...

    工厂方法模式源代码

    工厂方法模式(Factory Method Pattern)是设计模式中的创建型模式之一,它定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这个模式使类的实例化延迟到了子类,也就是所谓的“多态性工厂”。在Java中,...

    工厂方法模式Demo

    工厂方法模式是一种面向对象的设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个工厂类负责创建所关心的对象,而客户端代码则使用这些对象,而不必知道对象是如何被创建的。这种...

    工厂方法模式源文件

    工厂方法模式是面向对象设计模式中的行为模式,它属于创建型模式的一种,主要解决的是当一个类不知道它所必须创建的对象的类的时候,或者当一个类希望由它的子类来决定实例化哪个类的时候,如何封装这个实例化过程的...

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

    工厂方法、简单工厂和抽象工厂是创建型设计模式的三种不同形式,它们都关注于对象的创建过程,但各有其特点和适用场景。 1. **工厂方法(Factory Method)**: 工厂方法模式定义了一个创建对象的接口,但让子类...

    java工厂方法模式

    Java工厂方法模式 Java工厂方法模式是一种创建型模式,它属于类的创建型模式。该模式的主要思想是,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。这样做的目的是将类的实例化操作延迟到子类中完成...

    工厂方法应用实例源码

    工厂方法(Factory Method)和抽象工厂方法(Abstract Factory Method)是两种常见的设计模式,尤其在Java编程中被广泛应用。这个"工厂方法应用实例源码"展示了如何在实际项目中使用这两种设计模式来实现一个馅饼店...

    工厂方法模式[C#]

    工厂方法模式是设计模式中的一种创建型模式,它在面向对象编程中扮演着重要的角色。在C#中,我们可以利用这种模式来抽象产品的创建过程,将具体的实例化操作延迟到子类中进行,从而实现代码的解耦和扩展性。 1. **...

    工厂方法模式应用案例

    工厂方法模式是面向对象设计模式中的行为模式之一,它提供了一种创建对象的最佳方式。在工厂方法模式中,我们创建对象时不直接实例化具体的产品,而是通过一个抽象工厂类来调用具体工厂子类的方法来生成对应的具体...

    抽象工厂,工厂方法,简单工厂

    在软件设计模式中,"抽象工厂"、"工厂方法"和"简单工厂"都是创建型设计模式,它们都用于封装对象的创建过程,提供了一种间接的途径来创建对象,从而使得代码更加灵活,易于扩展。下面将详细介绍这三个工厂模式。 ##...

Global site tag (gtag.js) - Google Analytics