我刚看过Factory Method。据我所知,它提供了一种将实例化委托给子类的方法。但我无法理解现实世界中的可能用途。
任何人都可以给出一个典型的例子,说明如何使用工厂方法模式,以便我可以与我所读到的内容相关联。
工厂方法模式是最佳解决方案的问题陈述足以说清楚。
答案 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