我对简单的工厂和工厂方法有点困惑。我的主要困难是互联网上的示例代码,甚至维基百科上的示例代码之间存在着巨大的差异,其中一些示例代码具有接口,有些示例代码的Switch案例,有些甚至寄存器。
我使用PHP创建了一个简单的示例,但我不确定它是否可以被认为是一个简单的工厂和/或工厂方法:
nome = $nome;
}
protected function getDataHora(): string {
return (new \DateTime())->format('Y-m-d h:I:s.v');
}
public abstract function insert(string $texto);
public abstract function read(): string;
}
class TextLog extends Log {
public function insert(string $texto) {
$log_entry = $this->getDataHora() . ";" . $texto . PHP_EOL;
file_put_contents($this->nome, $log_entry, FILE_APPEND | LOCK_EX);
}
public function read(): string {
return file_get_contents($this->nome);
}
}
class JsonLog extends Log {
public function insert(string $texto) {
$log_entry = ['data' => $this->getDataHora(), 'texto' => $texto];
$json = file_get_contents($this->nome);
$tempArray = json_decode($json, true);
if(!is_array($tempArray)){
$tempArray = [];
}
array_push($tempArray, $log_entry);
$jsonData = json_encode($tempArray);
file_put_contents($this->nome, $jsonData);
}
public function read(): string {
$json = file_get_contents($this->nome);
$array = json_decode($json);
return implode(";", $array);
}
}
class LogFactory {
public static function get(string $tipo): Log {
switch (strtoupper($tipo)) {
default:
case 'TXT':
return new TextLog("log.txt");
case 'JSON':
return new JsonLog("log.json");
}
}
}
$log = LogFactory::get('txt');
var_dump($log);
$log->insert('Testando 1,2,3...');发布于 2020-02-04 17:30:52
让我们考虑:
直接创建对象时,客户端代码通过new. 直接调用某些类构造函数,这在客户端代码和创建的类之间产生了很强的耦合。使用客户端和其他类意味着编辑客户机的代码(克隆和分叉代码),无论它们的new操作发生在哪里。(假设客户端代码足够抽象,可以在另一个上下文中重用,特别是在同一个程序中,这种编辑是不可取的)。
简单工厂将实际调用-- new构造函数实例化--隐藏在一个不被设计为被覆盖或多态的方法中。因此,简单工厂通常是一个静态方法。它将客户端和类(构造函数)之间的强耦合转换为客户端和静态工厂方法之间的强耦合。一个级别的间接转换以减少客户端中需要编辑的位置数量,从而将一个类的用法更改为另一个类。
工厂方法模式建立在此基础上,但增加了通过多态性重新实现工厂方法的能力。因此,有一个工厂对象的概念可以作为参数传递;在同一个程序中可以有多个/不同的工厂对象。客户端无需编辑就可以使用要创建的不同对象的客户端代码--相反,可以创建工厂的多态实现,并与它们一起使用客户端代码。
抽象工厂模式包含工厂方法的多个实现,这样单个抽象工厂就可以创建相互之间不一定是子类的相关类,它只是多个相关但不同工厂方法模式的聚合。
这些模式都没有多大意义,直到我们用一些距离代码来决定构造什么和仅仅构造的代码。后者通常可以被抽象以供重用,前提是它不会意外地硬编码要创建哪些具体类的决定。(在下一行代码上创建一个工厂,在下一行代码上创建一个对象,某种程度上破坏了整个概念,但有那么多的例子正是这样做的。)
这里是依赖注入和控制反转的地方:其思想是继续选择要构造哪些类,以进一步远离可重用客户端代码,后者的算法(S)使用工厂作为参数创建对象。
https://softwareengineering.stackexchange.com/questions/404687
复制相似问题