美文网首页设计模式
设计模式 工厂模式

设计模式 工厂模式

作者: Yohann丶blog | 来源:发表于2020-06-08 10:22 被阅读0次
    2020-06-05_5eda16d590209.jpeg

    工厂模式

    工厂模式三大类
    1、简单工厂模式(静态工厂方法模式)
    2、工厂方法模式
    3、抽象工厂模式(Kit模式)

    简单工厂模式

    • 介绍

    shiyanlou:又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    • 角色
    角色 说明
    Factory 抽象工厂类,负责创建具体产品的实例
    Product 抽象产品类,定义产品子类的公共接口
    ConcreteProduct 具体产品类,实现 Product 父类的接口功能,也可添加自定义的功能
    • 角色示例
    类名 担任角色 说明
    Poultry Product 抽象家禽类,定义家禽子类的公共接口
    Cat ConcreteProduct 猫类,实现家禽类的接口功能,也可添加自定义的功能
    Dog ConcreteProduct 狗类,实现家禽类的接口功能,也可添加自定义的功能
    Duck ConcreteProduct 鸭类,实现家禽类的接口功能,也可添加自定义的功能
    Pasture Factory 牧场类,负责饲养具体家禽的实例
    • UML 类图
    简单工厂模式.png
    • 创建 Pasture.php,内容如下:
    <?php 
    interface Poultry
    {
        public function breed();
    }
    
    class Cat implements Poultry
    {
        public function breed()
        {
            echo "I am cat, I can breed.".PHP_EOL;
        }
    }
    
    class Dog implements Poultry
    {
        public function breed()
        {
            echo "I am dog, I can breed.".PHP_EOL;
        }
    }
    
    class Duck implements Poultry
    {
        public function breed()
        {
            echo "I am duck, I can breed.".PHP_EOL;
        }
    }
    
    class Pasture
    {
        public static function feedPoultry($name){
            switch ($name) {
              case 'cat':
                return (new Cat)->breed();
                break;
              case 'dog':
                return (new Dog)->breed();
                break;
              case 'duck':
                return (new Duck)->breed();
                break;
            }
        }
    }
    
    $cat = Pasture::feedPoultry('cat');
    $dog = Pasture::feedPoultry('dog');
    $duck = Pasture::feedPoultry('duck');
    
    • 执行
    $ php Pasture.php
    I am cat, I can breed.
    I am dog, I can breed.
    I am duck, I can breed.
    

    工厂方法模式

    • 介绍

    shiyanlou:此模式中,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成。这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建。当系统需要新增一个产品,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则;

    • 角色
    角色 说明
    Product 抽象产品类,定义产品子类的公共接口
    ConcreteProduct 具体产品类,实现 Product 父类的接口功能,也可添加自定义的功能
    Factory 抽象工厂类,负责创建具体产品的实例
    ConcreteFactory 具体工厂类,实现 Factory 父类的接口功能,也可添加自定义的功能
    • 角色示例
    类名 担任角色 说明
    Livestock Product 抽象家畜类,定义家畜子类的公共接口
    Sheep ConcreteProduct 羊类,实现家畜类的接口功能,也可添加自定义的功能
    Cow ConcreteProduct 牛类,实现家畜类的接口功能,也可添加自定义的功能
    Pasture Factory 抽象牧场类,定义牧场子类的公共接口
    SheepPasture ConcreteFactory 羊牧场类,实现牧场类的接口功能,也可添加自定义的功能
    CowPasture ConcreteFactory 牛牧场类,实现牧场类的接口功能,也可添加自定义的功能
    • UML 类图
    工厂方法模式.png
    • 创建 Livestock.php,内容如下:
    <?php 
    interface Livestock{
        public function breed();
    }
    
    class Sheep implements Livestock
    {
        public function breed(){
            echo "I am sheep, I can breed.".PHP_EOL;
        }
    }
    
    class Cow implements Livestock
    {
        public function breed(){
            echo "I am cow, I can breed.".PHP_EOL;
        }
    }
    
    interface Pasture
    {
        public function feedLivestock();
    }
    
    class SheepPasture implements Pasture
    {
        public function feedLivestock()
        {
            return new Sheep();
        }
    }
    
    class CowPasture implements Pasture
    {
        public function feedLivestock()
        {
            return new Cow();
        }
    }
    
    $sheep = SheepPasture::feedLivestock();
    $sheep->breed();
    
    $cow = CowPasture::feedLivestock();
    $cow->breed();
    
    • 执行
    $ php Pasture.php
    I am sheep, I can breed.
    I am cow, I can breed.
    

    抽象工厂模式

    • 介绍

    baike:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。

    • 角色

    | 角色 | 说明 |
    | ------------ | ------------ | ------------ |
    |Factory|抽象工厂类,负责创建具体产品的实例|
    |ConcreteFactory|具体工厂类,实现 Factory 父类的接口功能,也可添加自定义的功能|
    |Product|抽象产品类,定义产品子类的公共接口|
    |ConcreteProduct|具体产品类,实现 Product 父类的接口功能,也可添加自定义的功能|

    • 角色示例
    类名 担任角色 说明
    Pastoral Factory 抽象牧区类,定义牧区子类的公共接口
    XinJiangPastoral ConcreteFactory 新疆牧区类,实现牧区类的接口功能,也可添加自定义的功能
    QingHaIPastoral ConcreteFactory 青海牧区类,实现牧区类的接口功能,也可添加自定义的功能
    Sheep Product 抽象羊类,定义羊子类的公共接口
    Lambskin ConcreteProduct 羔皮羊类,实现羊类的接口功能,也可添加自定义的功能
    TibetanSheep ConcreteProduct 藏羊类,实现羊类的接口功能,也可添加自定义的功能
    Cow Product 抽象牛类,定义牛子类的公共接口
    Yak ConcreteProduct 耗牛类,实现牛类的接口功能,也可添加自定义的功能
    Cattle ConcreteProduct 黄牛类,实现牛类的接口功能,也可添加自定义的功能
    • UML 类图
    抽象工厂模式.png
    • 创建 Pastoral.php,内容如下:
    <?php 
    
    interface Sheep{
        public function run();
    }
    
    class Lambskin implements Sheep
    {
        public function run()
        {
            echo "I am lambskin, I can run.".PHP_EOL;
        }
    }
    
    class TibetanSheep implements Sheep
    {
        public function run()
        {
            echo "I am tibetanSheep, I can run.".PHP_EOL;
        }
    }
    
    interface Cow{
        public function jump();
    }
    
    class Yak implements Cow
    {
        public function jump()
        {
            echo "I am yak, I can jump.".PHP_EOL;
        }
    }
    
    class Cattle implements Cow
    {
        public function jump()
        {
            echo "I am cattle, I can jump.".PHP_EOL;
        }
    }
    
    interface Pastoral{
        public function feedSheep();
        public function feedCow();
    }
    
    class XinJiangPastoral implements Pastoral
    {
        public function feedSheep()
        {
            return new Lambskin();
        }
    
        public function feedCow()
        {
            return new Yak();
        }
    
    }
    
    class QingHaIPastoral implements Pastoral
    {
        public function feedSheep()
        {
            return new TibetanSheep();
        }
    
        public function feedCow()
        {
            return new Cattle();
        }
    }
    
    $xinJiangPastoral = new XinJiangPastoral();
    $lambskin = $xinJiangPastoral->feedSheep();
    $lambskin->run();
    
    $yak = $xinJiangPastoral->feedCow();
    $yak->jump();
    
    $qingHaIPastoral = new QingHaIPastoral();
    $tibetanSheep = $qingHaIPastoral->feedSheep();
    $tibetanSheep->run();
    
    $cattle = $xinJiangPastoral->feedCow();
    $cattle->jump();
    
    • 执行
    $ php Pastoral.php
    I am lambskin, I can run.
    I am yak, I can jump.
    I am tibetanSheep, I can run.
    I am yak, I can jump.
    

    相关文章

      网友评论

        本文标题:设计模式 工厂模式

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