大话设计模式第十五章--抽象工厂模式、工厂模式、简单工厂模式类比
<?php class User { private $_name; public function __construct(string $name) { $this->_name = $name; } public function __get($name) { if ($name == '_name') { return $this->_name; } } public function __set($param, $value) { if ($param == '_name') { $this->_name = $value; } } } interface Iuser { public function insert(User $user); public function get_user(int $id); } class Sqlserver_user implements Iuser { public function insert(User $user) { echo "ADD A RECORD INTO TABLE OF USER OF SQL SERVER <br/> "; } public function get_user(int $id) { echo "GET A RECORD AGAINST ID FROM TABLE OF USER OF SQL SERVER <br/>"; return null; } } class Access_user implements Iuser { public function Insert(User $user) { echo "ADD A RECORD INTO TABLE OF USER OF Access SERVER <br/>"; } public function get_user(int $id) { echo "GET A RECORD AGAINST ID FROM TABLE OF USER OF Access SERVER <br/>"; return null; } } interface Ifactory { public function create_user() : Iuser; } class Sqlserver_factory implements Ifactory { public function create_user() : Iuser { return new Sqlserver_user(); } } class Access_factory implements Ifactory { public function create_user() : Iuser { return new Access_user(); } } //CLIENT CODE $user = new User('wangyang'); //$factory = new Sqlserver_factory(); $factory = new Access_factory(); $iu = $factory->create_user(); $iu->insert($user); $iu->get_user(1);

以上便为工厂模式的实现;
抽象工厂模式实现:
<?php class User { private $_name; public function __construct(string $name) { $this->_name = $name; } public function __get($name) { if ($name == '_name') { return $this->_name; } } public function __set($param, $value) { if ($param == '_name') { $this->_name = $value; } } } class Department { } interface Iuser { public function insert(User $user); public function get_user(int $id); } class Sqlserver_user implements Iuser { public function insert(User $user) { echo "ADD A RECORD INTO TABLE OF USER OF SQL SERVER <br/> "; } public function get_user(int $id) { echo "GET A RECORD AGAINST ID FROM TABLE OF USER OF SQL SERVER <br/>"; return null; } } class Access_user implements Iuser { public function Insert(User $user) { echo "ADD A RECORD INTO TABLE OF USER OF Access SERVER <br/>"; } public function get_user(int $id) { echo "GET A RECORD AGAINST ID FROM TABLE OF USER OF Access SERVER <br/>"; return null; } } interface Idepartment { public function insert(Department $department); public function get_department(int $id); } class Sqlserver_department implements Idepartment { public function insert(Department $department) { echo "ADD A RECORD INTO TABLE OF DEPARTMENT OF SQL SERVER <br/>"; } public function get_department(int $id) { echo "GET A RECORD AGAINST ID FROM TABLE OF DEPARTMENT OF SQL SERVER <br/>"; } } class Access_department implements Idepartment { public function insert(Department $department) { echo "ADD A RECORD INTO TABLE OF DEPARTMENT OF Access SERVER <br/>"; } public function get_department(int $id) { echo "GET A RECORD AGAINST ID FROM TABLE OF DEPARTMENT OF Access SERVER <br/>"; } } interface Ifactory { public function create_user() : Iuser; public function create_departemnt() :Idepartment; } class Sqlserver_factory implements Ifactory { public function create_user() : Iuser { return new Sqlserver_user(); } public function create_departemnt() : Idepartment { return new Sqlserver_department(); } } class Access_factory implements Ifactory { public function create_user() : Iuser { return new Access_user(); } public function create_departemnt() : Idepartment { return new Access_department(); } } //CLIENT CODE $user = new User('wangyang'); //$factory = new Sqlserver_factory(); $factory = new Access_factory(); $iu = $factory->create_user(); $iu->insert($user); $iu->get_user(1); $dept = new Department(); $id = $factory->create_departemnt(); $id->insert($dept); $id->get_department(1);

抽象工厂模式:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
优点:
1、易于交换产品系类,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可,从而使用不同的产品配置。
2、它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
缺点:
新增一个接口,需要修改的地方太多了!!!
简单工厂来改进抽象工厂:
class DataAccess { const DB = 'SQL_SERVER'; // const DB = 'ACCESS'; static public function create_user() : Iuser { $result = null; switch (self::DB) { case 'SQL_SERVER': $result = new Sqlserver_user(); break; case 'ACCESS': $result = new Access_user(); break; } return $result; } static public function create_departemnt() : Idepartment{ $result = null; switch (self::DB) { case 'SQL_SERVER': $result = new Sqlserver_department(); break; case 'ACCESS': $result = new Access_department(); break; } return $result; } } //CLIENT CODE $user = new User('wangyang'); $dept = new Department(); $iu = DataAccess::create_user(); $iu->insert($user); $iu->get_user(1); $id = DataAccess::create_departemnt(); $id->insert($dept); $id->get_department(1);

浙公网安备 33010602011771号