我刚阅读了关于工厂方法的内容,我理解它提供了一种委托实例化给子类的方式。但我无法理解在实际场景中可能的用途。
有没有人能够给出一个典型的示例,展示工厂方法模式如何使用,以便我可以将其与我所阅读的内容联系起来。
如果提供一个最佳解决方案是工厂方法模式的问题描述,就足以使其清晰明了。
我刚阅读了关于工厂方法的内容,我理解它提供了一种委托实例化给子类的方式。但我无法理解在实际场景中可能的用途。
有没有人能够给出一个典型的示例,展示工厂方法模式如何使用,以便我可以将其与我所阅读的内容联系起来。
如果提供一个最佳解决方案是工厂方法模式的问题描述,就足以使其清晰明了。
实现工厂设计模式的类作为多个类之间的桥梁。以使用多个数据库服务器(如SQL Server和Oracle)为例。如果您正在使用SQL Server数据库作为后端开发应用程序,但将来需要将后端数据库更改为Oracle,则需要修改所有代码,如果您没有按照工厂设计模式编写代码。
在工厂设计模式中,您只需要做很少的工作即可实现此目标。实现工厂设计模式的类会代替您完成这些工作,减轻您的负担。切换数据库服务器不会对您造成任何麻烦。您只需要在配置文件中进行一些小的更改即可。
一个使用静态创建的PHP代码示例:
interface DbTable
{
public function doSomething(): void;
}
class MySqlTable implements DbTable
{
public function doSomething(): void
{ }
}
class OracleTable implements DbTable
{
public function doSomething(): void
{ }
}
class TableFactory
{
public static function createTable(string $type = null): DbTable
{
if ($type === 'oracle') {
return new OracleTable();
}
return new MySqlTable(); // default is mysql
}
}
// client
$oracleTable = TableFactory::createTable('oracle');
$oracleTable->doSomething();
interface DbTable
{
public function doSomething(): void;
}
class MySqlTable implements DbTable
{
public function doSomething(): void
{ }
}
class OracleTable implements DbTable
{
public function doSomething(): void
{ }
}
class TableFactory
{
public static function createTable(string $tableName = null): DbTable
{
$className = __NAMESPACE__ . $tableName . 'Table';
if (class_exists($className)) {
$table = new $className();
if ($table instanceof DbTable) {
return $table;
}
}
throw new \Exception("Class $className doesn't exists or it's not implementing DbTable interface");
}
}
$tbl = TableFactory::createTable('Oracle');
$tbl->doSomething();
我正在开发的API:
WebGalleryFactory factory = WebGalleryFactory.newInstance (WebGalleryType.PICASA);
WebAlbum album = factory.createAlbum (title, description);
一个来自.NET 基类库(BCL)的例子是Control.CreateControlsInstance,它被很多其他(Windows Forms) Control类成员使用。
你可以重写这个受保护的方法,提供你自己的控件集合,例如当你正在实现一个自定义控件时。
IDatabase
。在 DI 可以很好地处理的情况下,工厂模式似乎有些过度设计了。 - Levi Fuller