大话设计模式第十五章--抽象工厂模式、工厂模式、简单工厂模式类比

<?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);

 

posted @ 2015-09-01 14:46  wy0314  阅读(139)  评论(0)    收藏  举报