首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单工厂法和工厂法有什么区别?

简单工厂法和工厂法有什么区别?
EN

Software Engineering用户
提问于 2020-02-04 15:05:47
回答 1查看 1.4K关注 0票数 1

我对简单的工厂和工厂方法有点困惑。我的主要困难是互联网上的示例代码,甚至维基百科上的示例代码之间存在着巨大的差异,其中一些示例代码具有接口,有些示例代码的Switch案例,有些甚至寄存器

我使用PHP创建了一个简单的示例,但我不确定它是否可以被认为是一个简单的工厂和/或工厂方法:

代码语言:javascript
复制
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...');
EN

回答 1

Software Engineering用户

发布于 2020-02-04 17:30:52

让我们考虑:

  • 直接创建对象,
  • 简单的工厂,
  • 工厂方法,
  • 抽象工厂

直接创建对象时,客户端代码通过new. 直接调用某些类构造函数,这在客户端代码和创建的类之间产生了很强的耦合。使用客户端和其他类意味着编辑客户机的代码(克隆和分叉代码),无论它们的new操作发生在哪里。(假设客户端代码足够抽象,可以在另一个上下文中重用,特别是在同一个程序中,这种编辑是不可取的)。

简单工厂将实际调用-- new构造函数实例化--隐藏在一个不被设计为被覆盖或多态的方法中。因此,简单工厂通常是一个静态方法。它将客户端和类(构造函数)之间的强耦合转换为客户端和静态工厂方法之间的强耦合。一个级别的间接转换以减少客户端中需要编辑的位置数量,从而将一个类的用法更改为另一个类。

工厂方法模式建立在此基础上,但增加了通过多态性重新实现工厂方法的能力。因此,有一个工厂对象的概念可以作为参数传递;在同一个程序中可以有多个/不同的工厂对象。客户端无需编辑就可以使用要创建的不同对象的客户端代码--相反,可以创建工厂的多态实现,并与它们一起使用客户端代码。

抽象工厂模式包含工厂方法的多个实现,这样单个抽象工厂就可以创建相互之间不一定是子类的相关类,它只是多个相关但不同工厂方法模式的聚合。

这些模式都没有多大意义,直到我们用一些距离代码来决定构造什么和仅仅构造的代码。后者通常可以被抽象以供重用,前提是它不会意外地硬编码要创建哪些具体类的决定。(在下一行代码上创建一个工厂,在下一行代码上创建一个对象,某种程度上破坏了整个概念,但有那么多的例子正是这样做的。)

这里是依赖注入和控制反转的地方:其思想是继续选择要构造哪些类,以进一步远离可重用客户端代码,后者的算法(S)使用工厂作为参数创建对象。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/404687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档