zoukankan      html  css  js  c++  java
  • PHP 工厂模式介绍

    工厂模式,顾名思义,如同工厂一样,你把原材料放入工厂中,出来的是成品,而你并不需要知道工厂里做了什么,工厂模式主要用于解耦。个人认为设计模式只能在实战中更好的理解,当前水平有限,欢迎大家交流

    简单工厂模式

    把对象的创建和使用的过程分开,比如: ClassA 调用 ClassB,那么 ClassA 只调用ClassB 的方法,至于实例化 ClassB 则在工厂内实现。这样既减少了代码的重复使用,也方便对 ClassB de 后期维护。如果 ClassB 实例化过程很复杂,使用简单工厂模式就会发现外部无需关注复杂的实例化,只管调用 ClassB 的方法即可,减少错误

    <?php
    namespace FactorySimpleFactory;
    
    
    class SimpleFactory
    {
        public function createProduction(): Production
        {
            return new Production();
        }
    }
    
    class Production
    {
        public function getPrice(int $price)
        {
            return $price * 2;
        }
    }
    
    class Test
    {
        public function __construct()
        {
            $factory = new SimpleFactory();
            $production = $factory->createProduction();
    
            if ($production instanceof Production) {
                echo 'Nice';
            }
        }
    }
    

    工厂方法模式

    主要用于限制类的公用方法

    <?php
    
    
    namespace FactorySimpleFactory;
    
    
    /**
     * Interface FunctionFactory
     * @package FactorySimpleFactory
     */
    interface FunctionFactory
    {
        /**
         * @param array $data
         * @return array
         */
        public function create(array $data);
    
        /**
         * @param int $id
         * @return bool
         */
        public function delete(int $id);
    
        /**
         * @param array $data
         * @return array
         */
        public function update(array $data);
    
        /**
         * @return array
         */
        public function select();
    }
    
    class ProductionRepository implements FunctionFactory
    {
        public function create(array $data)
        {
            // TODO: Implement create() method.
        }
    
        public function delete(int $id)
        {
            // TODO: Implement delete() method.
        }
    
        public function update(array $data)
        {
            // TODO: Implement update() method.
        }
    
        public function select()
        {
            // TODO: Implement select() method.
        }
    }
    

    抽象工厂模式

    抽象工厂模式 = 工厂方法模式+简易工厂模式

    <?php
    
    namespace FactorySimpleFactory;
    
    
    /**
     * Class AbstractFactory
     * @package FactorySimpleFactory
     */
    class AbstractFactory
    {
        /**
         * @param int $price
         * @param int $discount
         * @return PromotionPhoneProduct
         */
        public function createPromotionPhoneProduct(int $price, int $discount)
        {
            return new PromotionPhoneProduct($price, $discount);
        }
    
        /**
         * @param int $price
         * @return PhoneProduct
         */
        public function createPhoneProduct(int $price)
        {
            return new PhoneProduct($price);
        }
    }
    
    /**
     * Interface Product
     * @package FactorySimpleFactory
     */
    interface Product
    {
        /**
         * @return int
         */
        public function calculatePrice(): int;
    }
    
    /**
     * Class PhoneProduct
     * @package FactorySimpleFactory
     */
    class PromotionPhoneProduct implements Product
    {
        /**
         * @var int
         */
        private $price;
    
        /**
         * @var int
         */
        private $discount;
    
        /**
         * PhoneProduct constructor.
         * @param int $price
         * @param int $discount
         */
        public function __construct(int $price, int $discount)
        {
            $this->price = $price;
            $this->discount = $discount;
        }
    
        /**
         * @return int
         */
        public function calculatePrice(): int
        {
            return $this->price * $this->discount;
        }
    }
    
    /**
     * Class PhoneProduct
     * @package FactorySimpleFactory
     */
    class PhoneProduct implements Product
    {
        /**
         * @var int
         */
        private $price;
    
        /**
         * PhoneProduct constructor.
         * @param int $price
         * @param
         */
        public function __construct(int $price)
        {
            $this->price = $price;
        }
    
        /**
         * @return int
         */
        public function calculatePrice(): int
        {
            return $this->price;
        }
    }
    

    静态工厂方法

    静态方法主要用于构建相同类型的对象

    <?php
    
    
    namespace FactorySimpleFactory;
    
    
    /**
     * Class StaticFactory
     * @package FactorySimpleFactory
     */
    class StaticFactory
    {
        /**
         * @param string $type
         * @return NumericClass|StringClass
         */
        public static function build(string $type)
        {
            switch ($type) {
                case 'string':
                    return new StringClass();
                    break;
                case 'numeric':
                    return new NumericClass();
                default:
                    break;
            }
        }
    }
    
    /**
     * Interface TypeInterface
     * @package FactorySimpleFactory
     */
    interface TypeInterface
    {
        /**
         * @return mixed
         */
        public function getType();
    }
    
    /**
     * Class NumericClass
     * @package FactorySimpleFactory
     */
    class NumericClass implements TypeInterface
    {
        /**
         * @return mixed|void
         */
        public function getType()
        {
            // TODO: Implement getType() method.
        }
    }
    
    /**
     * Class StringClass
     * @package FactorySimpleFactory
     */
    class StringClass implements TypeInterface
    {
        /**
         * @return mixed|void
         */
        public function getType()
        {
            // TODO: Implement getType() method.
        }
    }
    

    四种工厂模式的优缺点

    待补充

  • 相关阅读:
    WPF 命令基础
    委托 C#
    Volley网络请求框架的基本用法
    MailOtto 实现完美预加载以及源码解读
    Android_时间服务
    Android_Chronometer计时器
    Android_Json实例
    完结篇
    就快完结篇
    MySQL 选出日期时间最大的一条记录
  • 原文地址:https://www.cnblogs.com/it-abel/p/11031845.html
Copyright © 2011-2022 走看看