1. 程式人生 > >PHP設計模式之——工廠模式

PHP設計模式之——工廠模式

在開發大型系統過程中,往往會出現這樣一種情況:

我有一部分基礎資料,是類classA是從資料庫A讀取出來的,其他很多的功能都是基於這個基礎資料來操作的。現在呢,我想把資料從資料庫A變成從另外的資料來源去獲取,這時候,要修改起來就比較麻煩,要修改其他很多類的程式碼。這種設計顯然是不夠靈活的,換句話說,就是緊耦合的,系統中某個部分的函式或類嚴重依賴於系統的其他部分中的函式或類的行為和結構。

工廠模式,就是解決這樣的一些情況的設計方法。工廠模式是一種類,建立了一個工廠來根據所需來建立物件,這種方式在多型性程式設計中是很重要的,允許動態替換類,修改配置等。

工廠模式分為:簡單工廠模式、工廠方法模式、抽象工廠模式。

簡單工廠模式,通過靜態方法建立物件。可以理解成,只負責生產同一等級結構中的任何一個產品,但是不能新增產品。

工廠方法模式,去掉了簡單工廠模式中方法的靜態屬性,使其可以被子類整合,定義一個建立物件的介面,讓子類去決定例項化哪個類。可以理解成,用來生產同一等級結構中的固定產品,但是支援增加產品。

抽象工廠模式,提供一個建立一系列相關或者相互依賴的物件的介面。可以理解成,用來生產不用型別的全部產品,但是不能增加新品,支援增加新的型別。

用程式碼來一一舉例:

<?php
/**
 * 基本工廠模式
 * */
class User { 
    private $username; 
    public function __construct($username) { 
        $this->username = $username; 
    } 
    
    public function getUser() { 
        return $this->username; 
    } 
}

class userFactory { 
    static public function createUser() { 
        return new User('Jack'); 
    } 
}

$user = userFactory::createUser();echo $user->getUser();

/**
 *簡單工廠模式
 * */
interface userProperties {
    function getUsername();
    function getGender();
    function getJob();
}
class User implements userProperties{
    private $username;
    private $gender;
    private $job;
    public function __construct($username, $gender, $job) {
        $this->username = $username;
        $this->gender = $gender;
        $this->job = $job;
    }

    public function getUsername() {
        return $this->username;
    }

    public function getGender() {
        return $this->gender;
    }

    public function getJob() {
        return $this->job;
    }
}

class userFactory {
    static public function createUser($properties = []) {
        return new User($properties['username'], $properties['gender'], $properties['job']);
    }
}

$employers = [
    ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
    ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
    ];
$user = userFactory::createUser($employers[0]);
echo $user->getUsername();

/**
 * 工廠方法模式
 **/
interface userProperties {
    function getUsername();
    function getGender();
    function getJob();
}

interface createUser {
    function create($properties);
}

class User implements userProperties{
    private $username;
    private $gender;
    private $job;
    public function __construct($username, $gender, $job) {
        $this->username = $username;
        $this->gender = $gender;
        $this->job = $job;
    }

    public function getUsername() {
        return $this->username;
    }

    public function getGender() {
        return $this->gender;
    }

    public function getJob() {
        return $this->job;
    }
}

class userFactory {
    private $user;
    public function __construct($properties = []) {
        $this->user =  new User($properties['username'], $properties['gender'], $properties['job']);
    }

    public function getUser() {
        return $this->user;
    }
}

class FactoryMan implements createUser {
    function create($properties) {
        return new userFactory($properties); 
    }
} 

class FactoryWoman implements createUser {
    function create($properties) {
        return new userFactory($properties);
    }
}

class clientUser {
    static public function getClient($properties) {
        $fac = new FactoryMan;
        $man = $fac->create($properties);
        echo $man->getUser()->getUsername();
    }
}

$employers = [
    ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
    ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
    ];
$user = clientUser::getClient($employers[0]);

/**
 * 抽象工廠模式
 * */

interface userProperties {
    function getUsername();
    function getGender();
    function getJob();
}

interface createUser { //將物件的建立抽象成一個介面
    function createOpen($properties);//內向建立
    function createIntro($properties);//外向建立
}

class User implements userProperties{
    private $username;
    private $gender;
    private $job;
    public function __construct($username, $gender, $job) {
        $this->username = $username;
        $this->gender = $gender;
        $this->job = $job;
    }

    public function getUsername() {
        return $this->username;
    }

    public function getGender() {
        return $this->gender;
    }

    public function getJob() {
        return $this->job;
    }
}

class userFactory {
    private $user;
    public function __construct($properties = []) {
        $this->user =  new User($properties['username'], $properties['gender'], $properties['job']);
    }

    public function getUser() {
        return $this->user;
    }
}

class FactoryMan implements createUser {
    function createOpen($properties) {
        return new userFactory($properties); 
    }

    function createIntro($properties) {
        return new userFactory($properties); 
    }
} 

class FactoryWoman implements createUser {
    function createOpen($properties) {
        return new userFactory($properties);
    }

    function createIntro($properties) {
        return new userFactory($properties);
    }
}

class clientUser {
    static public function getClient($properties) {
        $fac = new FactoryMan;
        $man = $fac->createOpen($properties);
        echo $man->getUser()->getUsername();
    }
}

$employers = [
    ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
    ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
    ];
$user = clientUser::getClient($employers[0]);