php设计模式-工厂模式

工厂模式

是一种类,建立了一个工厂来根据所需来创建对象,这种方式在多态性编程中是很重要的,允许动态替换类,修改配置等。

         简单工厂模式

                   通过静态方法创建对象。可以理解成,只负责生产同一等级结构中的任何一个产品,但是不能新增产品。

简单工厂模式例子:

//工厂接口
interface UserInterface{
    function getUserName();
    function getName();
    function getJob();
}
//实现工厂接口
class User implements  UserInterface{
    private $UserName;
    private $Name;
    private $Job;
    public function __construct($UserName,$Name,$Job){
        $this->UserName=$UserName;
        $this->Name=$Name;
        $this->Job=$Job;
    }
    function getUserName(){
        return $this->UserName;
    }
    function getName(){
        return $this->Name;
    }
    function getJob(){
        return $this->Job;
    }
}
//静态调用对象返回实例化
class UserFactory{
    static public function getUser($list){
        return new User($list['UserName'], $list['Name'], $list['Job']);
    }
}
$list=array('UserName'=>'username','Name'=>'name','Job'=>'Job');
$User=UserFactory::getUser($list);
echo $User->getUserName();

工厂方法模式

                   去掉了简单工厂模式中方法的静态属性,使其可以被子类集成,定义一个创建对象的接口,让子类去决定实例化哪个类。用来生产同一等级结构中的固定产品,但是支持增加产品。

工厂方法模式:

interface UserInterface{ //定义工厂接口
    function getUserName();
    function getName();
    function getJob();
}

interface CreateUser{ 
    function Create($list);
}

class User implements UserInterface{
    private $UserName;
    private $Name;
    private $Job;
    public function __construct($UserName,$Name,$Job){
        $this->UserName=$UserName;
        $this->Name=$Name;
        $this->Job=$Job;
    }
    function getUserName(){
        return $this->UserName;
    }
    function getName(){
        return $this->Name;
    }
    function getJob(){
        return $this->Job;
    }
}

class UserFactory{
    private $User;
    public function __construct($list){
        $this->User=new User($list['UserName'],$list['Name'],$list['Job']);
    }
    public function getUser(){
        return $this->User;
    }
}

class MainFactory implements CreateUser{
    public function Create($list){
        return new UserFactory($list);
    }
}

class clientUser{
    static public function getclient($list){
        $Main=new MainFactory;
        $User_t=$Main->Create($list);
        echo $User_t->getUser()->getUserName();
    }
}

$list=array('UserName'=>'aa','Name'=>'cc','Job'=>'dd');

$get_Client=clientUser::getclient($list);

抽象工厂模式

                   提供一个创建一系列相关或者相互依赖的对象的接口。可以理解成,用来生产不用类型的全部产品,但是不能增加新品,支持增加新的类型。

抽象工厂模式例子:

//定义工厂基本接口
interface UserInterface{
    function getUserName();
    function getGender();
    function getJob();
}
/**
 * 将User对象创建抽象成一个接口 UserCreate
 * createOpen内向创建 
 * createInfo外向创建 
 */
interface UserCreate{
    function createOpen($list);
    function createInfo($list);
}

//对象实现工厂基本接口
class User implements UserInterface{
    private $UserName;
    private $Gender;
    private $Job;
    public function __construct($UserName,$Gender,$Job){
        $this->UserName=$UserName;
        $this->Gender=$Gender;
        $this->Job=$Job;
    }
    function getUserName(){
        return $this->UserName;
    }
    function getGender(){
        return $this->Gender;
    }
    function getJob(){
        return $this->Job;
    }
}

//工厂:User对象实例化保存到User属性里面
class UserFactory{
    private $User;
    public function __construct($list){
        $this->User=new User($list['UserName'],$list['Gender'],$list['Job']);
    }
    public function getUser(){
        return $this->User;
    }
}
//实现对象抽象接口
class MainFactory implements UserCreate{
    function createOpen($list){
        return new UserFactory($list);
    }
    function createInfo($list){
        return new UserFactory($list);
    }
}

class clientUser{ //客户端调用
    static public function getclientUer($list){
        $main=new MainFactory;
        $Users=$main->createOpen($list);
        echo $Users->getUser()->getUserName();
    }
}
/**
 * 定义数组必须有键值对并且键的值必须有
 * UserName,Gender,Job这三项。
 */
$list=array(
    'UserName'=>"aaaa",
    'Gender'=>"dddd",
    'Job'=>"eeee"
);
/**
 * 实例化clientUser类
 * 调用静态方法
 */
$new=new clientUser();
$new->getclientUer($list);
//$new=clientUser::getclientUser($list);也可以这样写




原文地址:https://www.cnblogs.com/sztx/p/9499758.html