`
Dapple
  • 浏览: 101676 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

工厂方法模式(Factory method)以及与抽象工厂(abstract factory)的区别

阅读更多
先看经典说法,

Define an interface for creating an object, but let subclasses
decidewhich class to instantiate. Factory Method lets a class defer
instantiation to subclasses. ----Gang of Four (定义一个创建对象的接口,
让子类决定用哪个类来实例化对象。工厂方法把类的实现放在子类中完成。)

Gang of Four把这一段看作是这个模式的目的(intent),但我看更像该模式的方
法(apporach)。因为连形式都说的很清楚了。

1. 一个接口。
2. 接口中有一个创建方法。

对这个接口的使用必然涉及工厂模式。它的使用方式是多种多样的。

我们来看一个例子,

1.
public interface ImageReader {
    public DecodedImage getDecodedImage();
}

2.
public class GifReader implements ImageReader {
    public DecodedImage getDecodedImage() {
        return decodedImage;
    }
}

3.
public class JpegReader implements ImageReader { // ....
}

4.
public class ImageReaderFactory {
    public static ImageReader getImageReader(InputStream is) {
        int imageType = determineImageType(is);
        switch(imageType) {
        case ImageReaderFactory.GIF:
        return new GifReader(is);
        case ImageReaderFactory.JPEG:
        return new JpegReader(is);
       // etc.
        }
  }
}

5.
public class client{
    public void useImageReader(){
        ImageReader ir = ImageReaderFactory.getImageReader(is);
        Decodedimage di = ir.getDecodedImage();
        di.doSth();
    }
}

使用工厂方法模式,必须要有1,2或3,5这三个环节。1是包含有创建方法的接口,
2或3是对接口的实现,5是客户端对接口的使用。变化比较多的就是第四个环节,
也就是new子类的环节。这个例子是在static方法中调用new来用子类来实例化接
口.

我们再看一个例子

public abstract class TemplateClient {
    public Map queryDatabase(String queryString) {
        RdfDatabase db = databaseFactory();

        checkQueryIsValid(queryString);

        return db.find(queryString);
    }
    public abstract RdfDatabase databaseFactory(); 

}

public class JenaClient extends TemplateClient {
    public RdfDatabase databaseFactory() { return new JenaDatabase(); }

上面的例子中是在static方法中调用的new,而你完全可以根据具体情况在你想要
的任何地方做实例化工作,比如在另一个类中这样写:
TemplateClient t = new
JenaClient(); RdfDatabase rdf = t.databaseFactory();
rdf.queryDatabase("select * from table");

你也可以在TemplateClient的子类JenaClient中这样使用,

public class JenaClient extends TemplateClient {
    public RdfDatabase databaseFactory() {
        return new JenaDatabase();
    }
//这样使用
    public void use(){
        queryDatabase("select * from table");
    }
}


在这个例子中,TemplateClient既扮演了客户端(客户端在这里是指是使用创建方
法的对象)的角色,又扮演了工厂模式中的接口的角色。这个例子中,工厂方法
模式配合了模板模式(模板模式参见..)

工厂模式极为常见,它变化万千,但不变的是,实际上可以归为一点,存在一个
创建接口。只要你实现这个接口、使用这个接口,不可避免的就会使用工厂方法
模式,即使你没有意识到这一点。

比如有个抽象接口A, 如下

interface A{
    ProductB b = createB();
}


你如果使用这样的创建接口A,就不可避免的要涉及对接口A的引用,以及对接口
A的实例化以及对ProdctB的引用。你只要使用了接口A,你的一系列做法就会符合
是工厂方法模式。

抽象工厂模式所不同的是,接口A所创建的对象不是产品,而是用来创建产品的工
厂。如下:

interface A{
    Factory f = createFactory();
}


抽象工厂模式就是用工厂方法模式来实现的。所以它们二者很像。其实工厂方法
模式更准确的写法应该是这样:

interface A{
   抽象对象B b = create具体对象B();
}


工厂方法模式不管抽象对象B是谁,这个对象是product也好,是工厂对象也好,
这都是工厂方法模式的应用,只是如果这个对象是工厂对象,则它会又延伸一套
抽象工厂模式。

抽象工厂也可以不用工厂方法模式配合,看这个例子,

public class client{
    public void doSomething(){
        MyAbstractFactory f = new MyConcreteFactory();
        Product1 p1 = f.getProduct1();
        Product2 p2 = f.getProduct2();
        p1.doSomethingWith(p2);
    }
}


这里用到了抽象工厂,MyAbstractFactory就是个抽象工厂。但抽象工厂的创建是
直接new出来来,如果你想换一个具体的工厂,你只能修改代码,该成这样,

MyAbstractFactory f = new MyAnotherConcreateFactory();

但如果配合上工厂方法模式,就可以变成这样,

public class client{
    public void doSomething(){
        MyAbstractFactory f = new MyConcreteFactory();
        Product1 p1 = f.getProduct1();
        Product2 p2 = f.getProduct2();
        p1.doSomethingWith(p2);
    }

public abstract MyAbstractFactory createFactory();
}

public class ASubClass extends client{
public MyAbstractFactory createFactory(){
return new MyConcreteFactory();
}
}


这是工厂方法模式,就像前面说的那样,它有一个创建接口(abstract
createFactory()可以看做接口),有对这个接口的实现。它也是抽象工厂模式。
或者说,这种抽象工厂的创建,使用了工厂方法模式。

希望这篇文章能帮你从形式上理解工厂方法模式以及它和抽象工厂模式的区别。
关于抽象工厂的详细讲解,请参考http://hi.baidu.com/dapplehou/blog/item /f4645edf52a4c21f4954038a.html
0
0
分享到:
评论

相关推荐

    工厂方法和抽象工厂——Factory Method & Abstract Factory

    在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...

    工厂方法模式(FactoryMethod)

    通常,这样的示例可能包括一个`AbstractFactory`(工厂接口)、一个或多个`ConcreteFactory`(具体工厂类)以及与之对应的`ConcreteProduct`(具体产品类)。 例如,假设我们有一个电子产品制造厂,有生产手机和...

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

    Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。

    创建型模式之工厂方法模式(Factory Method Pattern)

    1. 抽象工厂(Abstract Factory):这是工厂方法模式的核心接口,它声明了一组用于创建产品的公共方法。抽象工厂通常为抽象类或接口。 2. 具体工厂(Concrete Factory):实现了抽象工厂接口,提供具体的产品实例。...

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

    3. 抽象工厂(Abstract Factory):这是工厂方法模式的核心,它声明了创建产品的接口。每个子类可以提供一个实现,用于创建相应的产品。 4. 具体工厂(Concrete Factory):实现了抽象工厂接口,提供了具体的产品...

    创建型-抽象工厂模式(Abstract Factory)

    此外,抽象工厂模式还可以与其他设计模式结合使用,比如工厂方法模式(Factory Method Pattern),在某些情况下,可以将抽象工厂模式的抽象工厂类设计为工厂方法模式,让子类决定实例化哪一个类。同时,抽象工厂模式...

    工厂方法模式和抽象工厂模式

    在软件设计模式中,工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)是两种常用的创建型设计模式,它们都属于“工厂”家族,但有着不同的应用场景和目标。 工厂方法模式的核心...

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

    抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象和扩展,它为创建一组相关的或相互依赖的对象提供一个统一的接口,而不需要指定它们的具体类。这种模式适用于当系统需要创建一系列相关或相互...

    Factory Method 工厂方法模式(创建型模式)

    ### Factory Method 工厂方法模式(创建型模式) #### 概述 在软件工程领域,设计模式是一种在特定上下文中解决常见问题的通用方案。Factory Method(工厂方法)模式是GoF(Gang of Four)设计模式之一,属于创建型...

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

    3. **抽象工厂(Abstract Factory)**: 抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。它允许客户端创建一个产品族,其中每个产品都是同一类别中的一个实例,如创建GUI组件...

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

    ### 抽象工厂(Abstract Factory) 抽象工厂模式是一种为创建一组相关或相互依赖的对象提供一个共同接口的设计模式。它允许客户端不指定产品的具体类,而只依赖于一个公共的工厂接口。抽象工厂模式通常包括以下角色...

    工厂方法模式源代码

    1. 抽象工厂(Abstract Factory):这是工厂方法模式的核心,定义一个创建对象的接口,但不直接实例化对象。 2. 具体工厂(Concrete Factory):实现了抽象工厂定义的接口,负责具体创建产品。 3. 抽象产品...

    java工厂方法模式

    * 抽象工厂(Creator):是工厂方法模式的核心,负责定义创建抽象产品对象的工厂方法。 * 具体工厂(Concrete Creator):是工厂方法模式的对外接口,负责实现创建具体产品对象的内部逻辑。 * 抽象产品(Product):...

    C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式)

    本文将深入探讨面向对象设计中的“工厂方法模式”,这是一种创建型设计模式,它提供了一种在父类中定义创建对象的接口,但允许子类决定实例化哪个类。这种模式在C#中广泛应用,能有效提高代码的灵活性和可扩展性。 ...

    设计模式——工厂方法模式

    在这个压缩包中,`FactoryMethod`可能包含了Java实现工厂方法模式的源代码示例。 设计模式是一种在特定场景下解决软件设计问题的通用、可重用的解决方案,它代表了最佳实践,被广泛应用于各种编程语言中。工厂方法...

    002FactoryMethod.rar

    3. 抽象工厂(Abstract Factory):声明一个用于创建产品对象的工厂方法,但不具体实现该方法。通常这个抽象类为抽象类或接口。 4. 具体工厂(Concrete Factory):实现了抽象工厂声明的工厂方法,用于创建具体的...

    工厂方法模式Java代码

    工厂方法模式是设计模式中的创建型模式,它提供了一种创建对象的最佳方式。在这个模式中,一个工厂类负责创建对象,而具体的创建过程被延迟到子类中实现。这种模式的关键在于封装了对象的创建过程,并允许在运行时...

    工厂方法模式源文件

    通过阅读和分析源文件`FactoryMethod`,我们可以深入理解工厂方法模式的实现细节,例如工厂类如何创建产品对象,产品对象如何通过接口或抽象类进行交互等。这对于学习和应用设计模式,以及提高代码的可维护性和扩展...

Global site tag (gtag.js) - Google Analytics