Categories
Chia sẻ

Design Pattern – mẫu Abstract Factory – ví dụ Abstract Factory với PHP

Abstract Factory là một design pattern thuộc nhóm creational

Mục tiêu của Abstract Factory pattern:
– Cung cấp một giao diện lớp, có chức năng tạo ra một tập hợp các đối tượng liên quan hoặc phụ thuộc lẫn nhau mà không chỉ ra đó là những lớp cụ thể
– Đóng gói một nhóm những lớp đóng vai trò “sản xuất” (Factory) trong ứng dụng, đây là những lớp được dùng để tạo lập các đối tượng

Ví dụ với Abstract Factory pattern PHP

 

<?php

/**
 * Abstract Factory
 */
abstract class AbstractCarFactory {
    abstract function makeSedanCar();
    abstract function makeSuvCar();
}

/**
 * Concrete Factory
 */
class BmwCarFactory extends AbstractCarFactory {
    private $manufacturer = 'BMW';
    function makeSedanCar() {
        return new BmwSedanCar;
    }
    function makeSuvCar() {
        return new BmwSuvCar;
    }
}

class MercedesCarFactory extends AbstractCarFactory {
    private $manufacturer = 'Mercedes';
    function makeSedanCar() {
        return new MercedesSedanCar;
    }
    function makeSuvCar() {
        return new MercedesSuvCar;
    }
}

/**
 * Abstract Object
 */
abstract class AbstractCar {
    abstract function getName();
    abstract function getEngine();
}

abstract class AbstractSedanCar extends AbstractCar {
    protected $bodyType = 'Sedan';
}
abstract class AbstractSuvCar extends AbstractCar {
    protected $bodyType = 'Suv';
}

class BmwSedanCar extends AbstractSedanCar {
    private $name;
    private $engine;
    function __construct() {
        $this->name = 'Bmw 340';
        $this->engine = '382-hp, 3.0-liter I-6';
    }
    function getName() {
        return $this->name;
    }
    function getEngine() {
        return $this->engine;
    }
}

class BmwSuvCar extends AbstractSedanCar {
    private $name;
    private $engine;
    function __construct() {
        $this->name = 'Bmw X5';
        $this->engine = '335-hp, 3.0-liter I-6';
    }
    function getName() {
        return $this->name;
    }
    function getEngine() {
        return $this->engine;
    }
}

class MercedesSedanCar extends AbstractSedanCar {
    private $name;
    private $engine;
    function __construct() {
        $this->name = 'Mercedes E350';
        $this->engine = '255-hp, 2.0-liter I-4';
    }
    function getName() {
        return $this->name;
    }
    function getEngine() {
        return $this->engine;
    }
}

class MercedesSuvCar extends AbstractSedanCar {
    private $name;
    private $engine;
    function __construct() {
        $this->name = 'Mercedes GLC43';
        $this->engine = '385-hp, 3.0-liter V-6';
    }
    function getName() {
        return $this->name;
    }
    function getEngine() {
        return $this->engine;
    }
}

/**
 * Test
 */
echo '=== Begin testing abstract factory patterm ===';
echo '<br>';
echo '<br>';
echo '--- Testing BmwCarFactory ---';
echo '<br>';
$bmwCarFactory = new BmwCarFactory;
$bmwCar = $bmwCarFactory->makeSedanCar();
echo 'Bmw car name: '.$bmwCar->getName();
echo '<br>';
echo 'Bmw car engine: '.$bmwCar->getEngine();

Trong ví dụ trên ta có 1 abstract factory là AbstractCarFactory chỉ định 2 class AbstractSedanCar và AbstractSuvCar sẽ tạo bởi concrete factory
Concrete class BmwCarFactory kế thừa AbstractCarFactory, và có thể tạo class BmwSedanCar và BmwSuvCar, đó là các class đúng với nhà sản xuất BMW.

 

Categories
Chia sẻ

Design Pattern là gì ? Mẫu thiết kế giải pháp phần mềm?

Một design pattern là một giải pháp tổng thể cho các vấn đề chung trong thiết kế phần mềm.

Một design pattern (mẫu thiết kế) không phải là một thiết kế hoàn thiện để mà có thể được chuyển đổi trực tiếp thành code, nó chỉ là một mô tả hay là sườn (template) mô tả cách giải quyết một vấn đề mà có thể được dùng trong nhiều tình huống khác nhau.

Thiết kế theo mẫu thì sẽ giúp chúng ta có 1 ứng dụng có bố cục tốt, tổ chức linh hoạt, dễ hiểu, dễ bảo trì và nâng cấp.

 

Các mẫu xuất phát từ một ý niệm kiến trúc đưa ra bởi Christopher Alexander vào năm 1987, với phát biểu: “Mỗi pattern mô tả một vấn đề xảy ra lặp đi lặp lại, và trình bày trọng tâm của giải pháp cho vấn đề đó, theo cách mà bạn có thể dùng đi dùng lại hàng triệu lần mà không cần phải suy nghĩ.”

Năm 1994, bốn tác giả Erich Gamma, Richard Helm, Ralph Johnson và John Vlissides đã cho xuất bản một cuốn sách với tiêu đề Design Patterns – Elements of Reusable Object-Oriented Software, đây là khởi nguồn của khái niệm design pattern trong lập trình phần mềm. Bốn tác giả trên được biết đến rộng rãi dưới tên Gang of Four (bộ tứ). Theo quan điểm của bốn người, design pattern chủ yếu được dựa theo những quy tắc sau đây về thiết kế hướng đối tượng:

  • Lập trình cho interface chứ không phải để implement interface đó.
  • Ưu tiên object composition hơn là thừa kế.

 

Hệ thống các mẫu Design pattern hiện có 23 mẫu được định nghĩa trong cuốn “Design patterns – Elements of Reusable Object Oriented Software” và được chia thành 3 nhóm:

Creational Pattern (nhóm khởi tạo – 5 mẫu) gồm:

  • Abstract Factory
  • Builder
  • Factory Method
  • Prototype
  • Singleton

Những Design pattern loại này cung cấp một giải pháp để tạo ra các object và che giấu được logic của việc tạo ra nó, thay vì tạo ra object một cách trực tiếp bằng cách sử dụng method new. Điều này giúp cho chương trình trở nên mềm dẻo hơn trong việc quyết định object nào cần được tạo ra trong những tình huống được đưa ra.

Structural Pattern (nhóm cấu trúc – 7 mẫu) gồm:

  • Adapter
  • Bridge
  • Composite
  • Decorator
  • Facade
  • Flyweight
  • Proxy

Những Design pattern loại này liên quan tới class và các thành phần của object. Nó dùng để thiết lập, định nghĩa quan hệ giữa các đối tượng.

Behavioral Pattern (nhóm tương tác/ hành vi – 11 mẫu) gồm:

  • Interpreter
  • Template Method
  • Chain of Responsibility
  • Command
  • Iterator
  • Mediator
  • Memento
  • Observer
  • State
  • Strategy
  • Visitor

Nhóm này dùng trong thực hiện các hành vi của đối tượng, sự giao tiếp giữa các object với nhau.

 

Chú ý: Design Pattern được tạo ra để giải quyết vấn đề, chứ không phải để phức tạp hóa nó. Design Pattern có thể giải quyết vấn đề, cũng có thể làm vấn đề rắc rối phức tạp hơn.