工厂方法模式的真实世界示例

时间:2010-03-05 10:51:26

标签: design-patterns factory-pattern

我刚看过Factory Method。据我所知,它提供了一种将实例化委托给子类的方法。但我无法理解现实世界中的可能用途。

任何人都可以给出一个典型的例子,说明如何使用工厂方法模式,以便我可以与我所读到的内容相关联。

工厂方法模式是最佳解决方案的问题陈述足以说清楚。

6 个答案:

答案 0 :(得分:48)

实现工厂设计模式的类充当多个类之间的桥梁。考虑使用SQL Server和Oracle等多个数据库服务器的示例。如果您正在使用SQL Server数据库作为后端开发应用程序,但是将来需要将后端数据库更改为oracle,如果您没有按照工厂设计模式编写代码,则需要修改所有代码。

在工厂设计模式中,您需要做很少的工作才能实现这一目标。实施工厂设计模式的课程会照顾您并减轻您的负担。从数据库服务器切换根本不会打扰你。您只需要在配置文件中进行一些小的更改。

答案 1 :(得分:8)

示例php代码:

interface DbTable
{
    public function create($array);
}

class MySqlTable implements DbTable
{
    public function create($array)
    {
        // add a record to a table on mysql database
    }
}

class OracleTable implements DbTable
{
    public function create($array)
    {
        // add a record to a table on oracle database
    }
}

class TableFactory
{
    private $dbTypeConfig = 'mysql';

    public function createTable()
    {
        if ($this->dbTypeConfig == 'mysql') {
            return new MySqlTable();
        } elseif ($this->dbTypeConfig == 'oracle') {
            return new OracleTable();
        }
        return null;
    }
}

答案 2 :(得分:3)

从我正在开发的API:

WebGalleryFactory factory = WebGalleryFactory.newInstance (WebGalleryType.PICASA);
WebAlbum album = factory.createAlbum (title, description);

在本例中,我使用Factory Method创建某种类型的抽象工厂(示例中为PICASA)。

这两种模式经常一起使用。

答案 3 :(得分:3)

Zend_Db在它的Zend_Db_Adapter类中使用它,允许根据从配置对象传递的数据库设置创建不同类型的数据库对象。

答案 4 :(得分:2)

.NET 基类库(BCL)中的一个示例是Control.CreateControlsInstance,它被(Windows窗体)控件类的许多其他成员使用。

您可以覆盖此受保护的方法,以提供您自己的控件集合,例如当您实现自定义控件时。

答案 5 :(得分:0)

简单工厂设计模式不属于四人帮。简单工厂模式是其中一个返回几个可能类之一的实例,具体取决于提供给它的数据。这意味着它返回的类具有相同的父类和方法,但是每个类对不同类型的数据执行不同的任务。 Here is the complete post with real world example