Hướng dẫn x pattern in php - x mẫu trong php

Design pattern là gì ?

Design Pattern là bộ môn thuộc về ngành khoa học máy tính chuyên nghiên cứu các kiên trúc phần mềm. Hiện nay tất cả các Framwork như Codeigniter, Zend, Laravel, ... đều có sử dụng nhữ kiến trúc design pattern có sẵn và mỗi Framwork sẽ có những kiểu design partern riêng. Design Pattern sử dụng nền tảng của lập trình hướng đối tượng, áp dụng các tính chất như tính kế thừa, hàm khởi tạo, tính đa hình, ... để làm nên những kiến trúc phần mềm đáp ứng cho project của họ.

Nội dung chính ShowShow

  • Design pattern là gì ?
  • Danh sách các mẫu design pattern
  • Các mẫu tạo lập
  • Các mẫu cấu trúc
  • Các mẫu ứng xử
  • Factory Pattern
  • 1. Factory method
  • Định nghĩa
  • Cách thực hiện
  • 2. Abstract Factory Pattern
  • Định nghĩa
  • Cách thực hiện

2. Abstract Factory PatternMVC

Cấu trúc

Hướng dẫn x pattern in php - x mẫu trong php

Danh sách các mẫu design pattern

Các mẫu tạo lập

Các mẫu tạo lập

Các mẫu cấu trúc

  • Các mẫu ứng xử
  • Factory Pattern
  • 1. Factory method
  • Định nghĩa
  • Cách thực hiện

Các mẫu cấu trúc

Các mẫu ứng xử

  • Factory Pattern
  • 1. Factory method
  • Định nghĩa
  • Cách thực hiện
  • 2. Abstract Factory Pattern
  • Cấu trúc
  • Một ví dụ điển hình về design pattern và được biết đến nhiều nhất tron PHP là cấu trúc MVC

Các mẫu ứng xử

Factory Pattern

  • 1. Factory method
  • Định nghĩa
  • Cách thực hiện
  • 2. Abstract Factory Pattern
  • Cấu trúc
  • Một ví dụ điển hình về design pattern và được biết đến nhiều nhất tron PHP là cấu trúc MVC
  • Ngoài ra còn một số pattern sau chúng ta sẽ từ từ tìm hiểu
  • Tham khảo từ wikipedia
  • (creational patterns)
  • Abstract factory pattern
  • Builder

Factory method pattern

Factory Pattern

1. Factory method

1. Factory method

Định nghĩa

Cách thực hiện

2. Abstract Factory Pattern

Cấu trúc

Cách thực hiện

2. Abstract Factory Pattern

  • Cấu trúc
  • Một ví dụ điển hình về design pattern và được biết đến nhiều nhất tron PHP là cấu trúc MVC
  • Ngoài ra còn một số pattern sau chúng ta sẽ từ từ tìm hiểu
  • Tham khảo từ wikipedia
  • (creational patterns)

Abstract factory pattern

Builder


interface Shape {
    // Có thể định nghĩa sẵn const hoặc không :D
    const SQUARE = 1;
    const CIRCLE = 2;
    const RECTANGLE = 3;
    // general method
    function draw();
}

Factory method pattern


class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}

class Square implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình vuông tại đây
        echo "Draw square";
    }
}

class Rectangle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình chữ nhật tại đây
        echo "Draw rectangle";
    }
}

Prototype


class ShapeFactory
{
    public function getShape($type) {
        switch ($type) {
            case Shape::SQUARE:
                return new Square;
                break;
            case Shape::CIRCLE:
                return new Circle;
                break;

            case Shape::RECTANGLE:
                return new Rectangle;
                break;
            default:
                return null
                break;
        }
        return null;
    }
}

Singleton

(structural patterns)


$factory = new ShapeFactory();
// hình tròn Shape::CIRCLE
$shapeCircle = $factory->getShape(Shape::CIRCLE);
$shapeCircle->draw();

Adapter

Bridge

Composite

2. Abstract Factory Pattern

Định nghĩa

Cách thực hiện

2. Abstract Factory Pattern

Cách thực hiện

  • 2. Abstract Factory Pattern: định nghĩa một giao tiếp cho thao tác khởi tạo các "sản phẩm" ảo (AbstractProduct)
  • ConcreteFactory: thực thi giao tiếp AbstractFactory để tạo ra đối tượng cụ thể: thực thi giao tiếp AbstractFactory để tạo ra đối tượng cụ thể
  • AbstractProduct: định nghĩa một lớp ảo cho một loại đối tương "sản phẩm": định nghĩa một lớp ảo cho một loại đối tương "sản phẩm"
  • Product: kế thừa từ từ lớp "sản phẩm" ảo AbstractProduct, các lớp Product định nghĩa từ đối tượng cụ thể: kế thừa từ từ lớp "sản phẩm" ảo AbstractProduct, các lớp Product định nghĩa từ đối tượng cụ thể
  • Client: sử dụng các lớp AbstractFactory và AbstractProduct trong hệ thống: sử dụng các lớp AbstractFactory và AbstractProduct trong hệ thống

Ví dụ

Sơ đồ UML mô tả 1 dạng Abstract Factory

Như chúng ta thấy, khác với Factory Method, ở hình vẽ có thêm 1 lớp Producer, vai trò tương tự với lớp Factory ở phần 1. Có thể nói đây là 1 mô hình mở rộng của pattern Factory Method.

Bước 1

Tạo interface Shape (được hiểu là 1


class Rectangle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình chữ nhật tại đây
        echo "Draw rectangle";
    }
}
6)


interface Shape {
    // Có thể định nghĩa sẵn const hoặc không :D
    const SQUARE = 1;
    const CIRCLE = 2;
    const RECTANGLE = 3;
    // general method
    function draw();
}

Bước 2

Tạo các class cụ thể implements cùng 1 interface


class Square implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình vuông tại đây
        echo "Draw square";
    }
}
1, đây chính là các

class Rectangle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình chữ nhật tại đây
        echo "Draw rectangle";
    }
}
8 đã được nhắc đến ở trên.


class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}

class Square implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình vuông tại đây
        echo "Draw square";
    }
}

class Rectangle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình chữ nhật tại đây
        echo "Draw rectangle";
    }
}

Bước 3

Tạo interface Color (1


class Rectangle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình chữ nhật tại đây
        echo "Draw rectangle";
    }
}
6 tương tự Shape)


class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}
0

Bước 4

Tương tự bước 2, tạo các class và implements cùng 1 interface


class ShapeFactory
{
    public function getShape($type) {
        switch ($type) {
            case Shape::SQUARE:
                return new Square;
                break;
            case Shape::CIRCLE:
                return new Circle;
                break;

            case Shape::RECTANGLE:
                return new Rectangle;
                break;
            default:
                return null
                break;
        }
        return null;
    }
}
0, dĩ nhiên cũng là dạng sản phẩm -

class Rectangle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình chữ nhật tại đây
        echo "Draw rectangle";
    }
}
8, của nhà máy -

class ShapeFactory
{
    public function getShape($type) {
        switch ($type) {
            case Shape::SQUARE:
                return new Square;
                break;
            case Shape::CIRCLE:
                return new Circle;
                break;

            case Shape::RECTANGLE:
                return new Rectangle;
                break;
            default:
                return null
                break;
        }
        return null;
    }
}
2


class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}
1

class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}
2

class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}
3

Bước 5

Tạo ra 1 lớp Abstract với phương thức giáo tiếp đến thao tác khởi tạo các Shape và Color object - đây chính là khái niệm


class ShapeFactory
{
    public function getShape($type) {
        switch ($type) {
            case Shape::SQUARE:
                return new Square;
                break;
            case Shape::CIRCLE:
                return new Circle;
                break;

            case Shape::RECTANGLE:
                return new Rectangle;
                break;
            default:
                return null
                break;
        }
        return null;
    }
}
3 được định nghĩa ở trên.


class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}
4

Bước 6

Tạo lớp Factory kế thừa AbstractFactory để thực hiện generate ra các object cụ thể dựa trên các thông tin được đưa ra. Các lớp này còn được gọi là


class ShapeFactory
{
    public function getShape($type) {
        switch ($type) {
            case Shape::SQUARE:
                return new Square;
                break;
            case Shape::CIRCLE:
                return new Circle;
                break;

            case Shape::RECTANGLE:
                return new Rectangle;
                break;
            default:
                return null
                break;
        }
        return null;
    }
}
4.

Shape Factory


class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}
5

Color Factory


class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}
6

Bước 7

Tạo FactoryProducer để khởi tạo 1 abstract Shape/Color Factory


class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}
7

Bước 8

Như vậy là đã gần đầy đủ 1 mô hình AbstractFactory, chúng ta chỉ cần phần


class ShapeFactory
{
    public function getShape($type) {
        switch ($type) {
            case Shape::SQUARE:
                return new Square;
                break;
            case Shape::CIRCLE:
                return new Circle;
                break;

            case Shape::RECTANGLE:
                return new Rectangle;
                break;
            default:
                return null
                break;
        }
        return null;
    }
}
5 để sử dụng AbstractFactory và AbstractProduct trong hệ thống/apps của mình.

Tạo 1 file php bất kì để test thôi


class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}
8

Bước 9

Cùng xem output


class Circle implements Shape
{
    public function draw() {
        // thực hiện code vẽ hình tròn tại đây
        echo "Draw circle";
    }
}
9