91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP設計模式的創建型有哪幾種?

發布時間:2020-05-13 11:56:58 來源:億速云 閱讀:218 作者:Leah 欄目:編程語言

PHP設計模式的創建型有哪幾種?相信很多新手小白對PHP設計模式的創建型的了解處于懵懂狀態,通過這篇文章的總結,希望你能有所收獲。

我們學習的設計模式分為三類:創建者模式、結構型模式、行為型模式;創建型模式與對象的創建有關;結構型模式處理類或對象的組合;而行為型模式是對類或對象怎樣交互和怎樣分配職責進行描述;

PHP 設計模式的創建型包括:單例模式(Singleton), 多例模式(Multiton), 工廠方法模式(Factory Method), 抽象工廠模式(Abstract Factory), 簡單工廠模式(Simple Factory), 原型模式(Prototype), 對象池模式(Pool), 建造者模式(Builder)

(一)單例模式(Singleton)

● 定義

保證一個類只有一個實例,并且提供一個訪問它的全局訪問點。系統內存中該類只存在一個對象,節省了系統資源,對于一些需要頻繁創建銷毀的對象,使用單例模式可以提高系統性能。

● 代碼示例

class Singleton
{
    /**
    * @var Singleton
    */
    private static $instance;
    /**
    * 不允許從外部調用以防止創建多個實例
    * 要使用單例,必須通過 Singleton::getInstance() 方法獲取實例
    */
    private function __construct()
    {
    }
    /**
    * 通過懶加載獲得實例(在第一次使用的時候創建)
    */
    public static function getInstance(): Singleton
    {
        if (null === static::$instance) {
            static::$instance = new static();
        }
        return static::$instance;
    }
    /**
    * 防止實例被克隆(這會創建實例的副本)
    */
    private function __clone()
    {
    }
    /**
    * 防止反序列化(這將創建它的副本)
    */
    private function __wakeup()
    {
    }
}

(二)多例模式(Multiton)

● 定義

在多例模式中,多例類可以有多個實例,而且多例類必須自己創建、管理自己的實例,并向外界提供自己的實例。1. 通過實例容器保存容器。2. 利用私有構造阻止外部構造。3. 提供getInstantce()方法獲取實例.

● 代碼示例  兩個對象通過一個類進行多次實例化

abstract class Multiton { 
    private static $instances = array(); 
    public static function getInstance() { 
        $key = get_called_class() . serialize(func_get_args());
        if (!isset(self::$instances[$key])) { 
            $rc = new ReflectionClass(get_called_class());
            self::$instances[$key] = $rc->newInstanceArgs(func_get_args());
        }
        return self::$instances[$key]; 
    }
    /**
     * 該私有對象阻止實例被克隆
     */
    private function __clone()
    {
    }
    /**
     * 該私有方法阻止實例被序列化
     */
    private function __wakeup()
    {
    }
} 
class Hello extends Multiton { 
    public function __construct($string = 'World') { 
        echo "Hello $string\n"; 
    } 
} 
class GoodBye extends Multiton { 
    public function __construct($string = 'my', $string2 = 'darling') { 
        echo "Goodbye $string $string2\n"; 
    }
}
$a = Hello::getInstance('World'); 
$b = Hello::getInstance('bob'); 
// $a !== $b 
$c = Hello::getInstance('World'); 
// $a === $c 
$d = GoodBye::getInstance(); 
$e = GoodBye::getInstance();
// $d === $e 
$f = GoodBye::getInstance('your'); 
// $d !== $f

(三)工廠方法模式(Factory Method)

● 定義

將類的實例化(具體產品的創建)延遲到工廠類的子類(具體工廠)中完成,即由子類來決定應該實例化(創建)哪一個類

● 代碼示例 : 小成有一間塑料加工廠(僅生產 A 類產品);隨著客戶需求的變化,客戶需要生產 B 類產品。改變原有塑料加工廠的配置和變化非常困難,假設下一次客戶需要再發生變化,再次改變將增大非常大的成本;小成決定置辦塑料分廠 B 來生產 B 類產品。

abstract class Product{
    public abstract function Show();
}
//具體產品A類
class  ProductA extends  Product{
    public function Show() {
        echo "生產出了產品A";
    }
}
//具體產品B類
class  ProductB extends  Product{
    public function Show() {
        echo "生產出了產品B";
    }
}
abstract class Factory{
    public abstract function Manufacture();
}
//工廠A類 - 生產A類產品
class  FactoryA extends Factory{
    public function Manufacture() {
        return new ProductA();
    }
}
//工廠B類 - 生產B類產品
class  FactoryB extends Factory{
    public function Manufacture() {
        return new ProductB();
    }
}

(四)抽象工廠模式(Abstract Factory)

● 定義

在不指定具體類的情況下創建一系列相關或依賴對象。 通常創建的類都實現相同的接口。 抽象工廠的客戶并不關心這些對象是如何創建的,它只是知道它們是如何一起運行的。

● 代碼示例 : 有兩個工廠,A 工廠負責運輸,B 工廠生產數碼產品.

interface Product
{
    public function calculatePrice(): int;
}
class ShippableProduct implements Product
{
    /**
     * @var float
     */
    private $productPrice;
    /**
     * @var float
     */
    private $shippingCosts;
    public function __construct(int $productPrice, int $shippingCosts)
    {
        $this->productPrice = $productPrice;
        $this->shippingCosts = $shippingCosts;
    }
    public function calculatePrice(): int
    {
        return $this->productPrice + $this->shippingCosts;
    }
}
class DigitalProduct implements Product
{
    /**
     * @var int
     */
    private $price;
    public function __construct(int $price)
    {
        $this->price = $price;
    }
    public function calculatePrice(): int
    {
        return $this->price;
    }
}
class ProductFactory
{
    const SHIPPING_COSTS = 50;
    public function createShippableProduct(int $price): Product
    {
        return new ShippableProduct($price, self::SHIPPING_COSTS);
    }
    public function createDigitalProduct(int $price): Product
    {
        return new DigitalProduct($price);
    }
}

(五)簡單工廠模式(Simple Factory)

● 定義

簡單工廠模式是一個精簡版的工廠模式。工廠角色-具體產品-抽象產品

● 代碼示例 :

一個農場,要向市場銷售水果。農場里有三種水果 蘋果、葡萄,我們設想:1、水果有多種屬性,每個屬性都有不同,但是,他們有共同的地方 | 生長、種植、收貨、吃。將來有可能會增加新的水果、我們需要定義一個接口來規范他們必須實現的方法.

interface fruit{
    /**
     * 生長
     */
    public function grow();
    /**
     * 種植
     */
    public function plant();
    /**
     * 收獲
     */
    public function harvest();
    /**
     * 吃
     */
    public function eat();
}
class apple implements fruit{
    //蘋果樹有年齡
    private $treeAge;
    //蘋果有顏色
    private $color;
    public function grow(){
        echo "grape grow";
    }
    public function plant(){
        echo "grape plant";
    }
    public function harvest(){
        echo "grape harvest";
    }
    public function eat(){
        echo "grape eat";
    }
    //取蘋果樹的年齡
    public function getTreeAge(){
        return $this->treeAge;
    }
    //設置蘋果樹的年齡
    public function setTreeAge($age){
        $this->treeAge = $age;
        return true;
    }
}
class grape implements fruit{
    //葡萄是否有籽
    private $seedLess;
    public function grow(){
        echo "apple grow";
    }
    public function plant(){
        echo "apple plant";
    }
    public function harvest(){
        echo "apple harvest";
    }
    public function eat(){
        echo "apple eat";
    }
    //有無籽取值
    public function getSeedLess(){
        return $this->seedLess;
    }
    //設置有籽無籽
    public function setSeedLess($seed){
        $this->seedLess = $seed;
        return true;
    }
}
class farmer
{
    //定義個靜態工廠方法
    public static function factory($fruitName){
        switch ($fruitName) {
            case 'apple':
                return new apple();
                break;
            case 'grape':
                return new grape();
                break;
            default:
                throw new badFruitException("Error no the fruit", 1);
                break;
        }
    }
}
class badFruitException extends Exception
{
    public $msg;
    public $errType;
    public function __construct($msg = '' , $errType = 1){
        $this->msg = $msg;
        $this->errType = $errType;
    }  
}
/**
 * 獲取水果實例化的方法
 */
try{
    $appleInstance = farmer::factory('apple');
    var_dump($appleInstance);
}catch(badFruitException $err){
    echo $err->msg . "_______" . $err->errType;
}

(六)原型模式(Prototype)

● 定義

相比正常創建一個對象 (new Foo () ),首先創建一個原型,然后克隆它會更節省開銷。

● 代碼示例 : 為每一本書設置標題

abstract class BookPrototype
{
    /**
    * @var string
    */
    protected $title = 0;
    /**
    * @var string
    */
    protected $category;
    abstract public function __clone();
    public function getTitle(): string
    {
        return $this->title;
    }
    public function setTitle($title)
    {
       $this->title = $title;
    }
}
class BarBookPrototype extends BookPrototype
{
    /**
    * @var string
    */
    protected $category = 'Bar';
    public function __clone()
    {
    }
}
class FooBookPrototype extends BookPrototype
{
    /**
    * @var string
    */
    protected $category = 'Foo';
    public function __clone()
    {
    }
}
$fooPrototype = new FooBookPrototype();
$barPrototype = new BarBookPrototype();
for ($i = 5; $i < 10; $i++) {
    $book = clone $fooPrototype;
    $book->setTitle('Foo Book No ' . $i);
    var_dump(new FooBookPrototype == $book);
}
for ($i = 0; $i < 5; $i++) {
    $book = clone $barPrototype;
    $book->setTitle('Bar Book No ' . $i);
    var_dump(new BarBookPrototype == $book);
}

(七)對象池模式(Pool)

● 定義

對象池可以用于構造并且存放一系列的對象并在需要時獲取調用。在初始化實例成本高,實例化率高,可用實例不足的情況下,對象池可以極大地提升性能。在創建對象(尤其是通過網絡)時間花銷不確定的情況下,通過對象池在短期時間內就可以獲得所需的對象。

● 代碼示例

class Factory {
    protected static $products = array();
    public static function pushProduct(Product $product) {
        self::$products[$product->getId()] = $product;
    }
    public static function getProduct($id) {
        return isset(self::$products[$id]) ? self::$products[$id] : null;
    }
    public static function removeProduct($id) {
        if (array_key_exists($id, self::$products)) {
            unset(self::$products[$id]);
        }
    }
}
Factory::pushProduct(new Product('first'));
Factory::pushProduct(new Product('second'));
print_r(Factory::getProduct('first')->getId());
// first
print_r(Factory::getProduct('second')->getId());
// second

(八)建造者模式(Builder)

● 定義

將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示

● 2)代碼示例  建造相同標準的卡車和汽車。類似于變形金剛,相同的零件進行不同的組合.

● 分為 Director 導演者,負責構建、BuilderInterface 構建接口,規范建造標準、TruckBuilder 構建卡車類 CarBuilder 構建汽車類

Vehicle 零部件公共類、Truck Car Engine Wheel Door 零部件類、DirectorTest 測試類

class Director
{
    public function build(BuilderInterface $builder): Vehicle
    {
        $builder->createVehicle();
        $builder->addDoors();
        $builder->addEngine();
        $builder->addWheel();
        return $builder->getVehicle();
    }
}
interface BuilderInterface
{
    public function createVehicle();
    public function addWheel();
    public function addEngine();
    public function addDoors();
    public function getVehicle(): Vehicle;
}
class TruckBuilder implements BuilderInterface
{
    /**
    * @var Truck
    */
    private $truck;
    public function addDoors()
    {
        $this->truck->setPart('rightDoor', new Door());
        $this->truck->setPart('leftDoor', new Door());
    }
    public function addEngine()
    {
        $this->truck->setPart('truckEngine', new Engine());
    }
    public function addWheel()
    {
        $this->truck->setPart('wheel1', new Wheel());
        $this->truck->setPart('wheel2', new Wheel());
        $this->truck->setPart('wheel3', new Wheel());
        $this->truck->setPart('wheel4', new Wheel());
        $this->truck->setPart('wheel5', new Wheel());
        $this->truck->setPart('wheel6', new Wheel());
    }
    public function createVehicle()
    {
        $this->truck = new Truck();
    }
    public function getVehicle(): Vehicle
    {
        return $this->truck;
    }
}
class CarBuilder implements BuilderInterface
{
    /**
    * @var Car
    */
    private $car;
    public function addDoors()
    {
        $this->car->setPart('rightDoor', new Door());
        $this->car->setPart('leftDoor', new Door());
        $this->car->setPart('trunkLid', new Door());
    }
    public function addEngine()
    {
        $this->car->setPart('engine', new Engine());
    }
    public function addWheel()
    {
        $this->car->setPart('wheelLF', new Wheel());
        $this->car->setPart('wheelRF', new Wheel());
        $this->car->setPart('wheelLR', new Wheel());
        $this->car->setPart('wheelRR', new Wheel());
    }
    public function createVehicle()
    {
        $this->car = new Car();
    }
    public function getVehicle(): Vehicle
    {
        return $this->car;
    }
}
abstract class Vehicle
{
    /**
    * @var object[]
    */
    private $data = [];
    /**
    * @param string $key
    * @param object $value
    */
    public function setPart($key, $value)
    {
        $this->data[$key] = $value;
    }
}
class Truck extends Vehicle
{
}
class Car extends Vehicle
{
}
class Engine extends Vehicle
{
}
class Wheel extends Vehicle
{
}
class Door extends Vehicle
{
}
class DirectorTest
{
    public function testCanBuildTruck()
    {
        $truckBuilder = new TruckBuilder();
        return (new Director())->build($truckBuilder);
    }
    public function testCanBuildCar()
    {
        $carBuilder = new CarBuilder();
        return (new Director())->build($carBuilder);
    }
}
$directorTest = new DirectorTest();
var_dump($directorTest->testCanBuildTruck());
var_dump($directorTest->testCanBuildCar());

以上就是PHP設計模式的創建型的詳細內容了,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業資訊!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

措美县| 永仁县| 稻城县| 东城区| 呼和浩特市| 和田县| 昭觉县| 高青县| 梨树县| 深州市| 雷山县| 新邵县| 左权县| 永顺县| 多伦县| 原阳县| 陇川县| 赫章县| 台北市| 喀喇沁旗| 缙云县| 海口市| 拜城县| 青海省| 屯留县| 彭水| 油尖旺区| 吐鲁番市| 贵港市| 清新县| 宜春市| 台前县| 临泉县| 长阳| 都江堰市| 团风县| 武安市| 蒙山县| 微博| 永新县| 清水河县|