美文网首页PHP程序员PHP经验分享
设计模式——工厂模式&抽象工厂模式

设计模式——工厂模式&抽象工厂模式

作者: 夜航星osmo | 来源:发表于2018-01-19 17:54 被阅读19次

Factory Method(工厂模式):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

工厂模式:根据不同的参数生成不同的类实例。

工厂模式分为:简单工厂模式工厂方法模式抽象工厂模式

①、简单工厂模式:通过静态方法创建对象。

②、工厂方法模式:去掉了简单工厂模式中方法的静态属性,使其可以被子类继承,定义一个创建对象的接口,让子类决定实例化哪个类。

③、抽象工厂模式:提供一个创建一系列相关或者相互依赖的对象的接口。

例子:

基本工厂模式(其实就是一个简单的类)

//定义一个用户类

class User

{

    private $username;//定义一个私有变量

    public function __construct($username)

    {

        $this->username = $username;

    }

    public function getUser()

    {

        return $this->username;

    }

}

//用户工厂类

class userFactory

{

    static public function createUser()//静态方法,无需实例化即可调用

    {

        //工厂类中实例化User类

        return new User('jack');

    }

}

$user = userFactory::createUser();

echo $user->getUser();//jack

简单工厂模式:通过静态方法创建对象。提供一个工厂方法供客户端调用。可能违反开闭原则。

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'=>'温柔只给意中人','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 __constract($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($properties[0]);

通过传入不同的参数实例化不同的类。

本文仅作为记录自己的学习历程,如有更好的见解,请在评论区留言。欢迎分享,交流经验!

相关文章

  • 常用设计模式

    设计模式 工厂模式 工厂模式思路上分:简单工厂模式,工厂模式, 抽象工厂模式// 抽象工厂模式可以代替工厂模式,做...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • Android 源码设计模式解析与实战 读书笔记 6 抽象工厂模

    创建型设计模式 —— 抽象工厂模式 1. 抽象工厂模式介绍 抽象工厂模式(Abstract Factory Pat...

  • 单件设计模式

    一、定义 设计模式 设计模式就是一种更好的编写代码方案。 常见设计模式 工厂设计模式、抽象工厂设计模式、抽象工厂设...

  • 设计模式系列-抽象工厂模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 简单工厂模式 抽象工厂模式 抽象工厂模式 定义 抽象工...

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 设计模式三、工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 工厂模式 在一...

  • Go语言设计模式(3)抽象工厂模式

    Go语言设计模式(3)抽象工厂模式 抽象工厂模式的定义 抽象工厂模式的定义如下: Provide an inter...

  • 创建型设计模式

    一 . 工厂模式 二. 抽象工厂设计模式

网友评论

    本文标题:设计模式——工厂模式&抽象工厂模式

    本文链接:https://www.haomeiwen.com/subject/znpooxtx.html