2011-01-18 30 views
14

Sau ~ 10 tháng thủ tục PHP, tôi hiện đang cố gắng bọc đầu xung quanh các nguyên tắc cơ bản về OOP và các mẫu thiết kế. Đây là một sở thích, và tôi đã không có nhiều thời gian như tôi muốn theo đuổi nó, vì vậy xin vui lòng tha thứ cho mức độ khá thấp của câu hỏi này.Nhà máy/Nhà máy trừu tượng nhầm lẫn

Trang web của tôi (hiện là 100% thủ tục) là một thư viện. Khách truy cập gửi tập lệnh thư viện 2 datapoints - một mục type và mục code.

Library.php sử dụng loại mục để chọn bao gồm và phần bao gồm lấy mã để truy cập cơ sở dữ liệu và sau đó tạo trang.

Một số ví dụ:

[type] [code] 
game RoTo 
map  32 
unit 216 

Một liên kết ví dụ sẽ là library.php?type=game&code=RoTo

Tất cả mọi thứ hoạt động độc đáo như là, nhưng như tôi đã bắt đầu với OOP tôi thấy rõ ràng dễ dàng điểm nhập cảnh và con đường thừa kế cho "objectifying" hệ thống này.

class LibraryObject 
{ 
    protected $_name; 
    protected $_description; 
} 

class Game extends LibraryObject 
{ 
    protected $_releaseDate; 
    etc. 
} 

Tôi cũng vui mừng về sự linh hoạt mà một số lớp học viết tốt sẽ cho tôi.

Ý tưởng mẫu thiết kế đang vấp ngã tôi. Nó có vẻ giống như một mô hình Nhà máy, nhưng tôi bối rối về sự khác biệt giữa FAF. Tôi đã đọc các câu hỏi SO khác đặc biệt yêu cầu câu hỏi đó, và tôi đã đọc các ví dụ trên OODesign nhưng tôi cảm thấy như chúng được viết bằng một ngôn ngữ khác và nó khá bực bội.

Có lẽ nếu ai đó có thể giải thích nó bằng cách sử dụng cấu trúc dữ liệu của riêng tôi thì điều đó có ý nghĩa hơn với tôi?

Xin lỗi vì sự cố.

Trả lời

32

Sự khác biệt giữa Nhà máyNhà máy trừu tượng là khá đơn giản. Trong phần sau, bản thân nhà máy là trừu tượng (!) Và không thể được khởi tạo trực tiếp, nhưng phải được phân loại phụ.

mỗi ví dụ, Nhà máy:

class Document { 
    public function createPage() { 
     return new Page; 
    } 
} 

class LandscapeDocument extends Document { 
    public function createPage() { 
     return new LandscapePage; 
    } 
} 

Trong Abstract Factory:

abstract class Document { 
    abstract public function createPage(); 
} 

class PortraitDocument extends Document { 
    public function createPage() { 
     return new PortraitPage; 
    } 
} 

class LandscapeDocument extends Document { 
    public function createPage() { 
     return new LandscapePage; 
    } 
} 

Nói tóm lại, mô hình Nhà máy có thực hiện mặc định trong lớp nhà máy riêng của mình. Nhà máy Tóm tắt yêu cầu tất cả các lớp con để triển khai phiên bản của riêng họ về các phương thức của nhà máy.

Đó là tất cả.

+0

Tôi có thể đúng trong việc mô tả hệ thống thư viện của tôi như là thích hợp cho một mẫu thiết kế Abstract Factory , với mô tả tôi đã đăng? – Drew

+2

@Andrew: Tôi tin rằng Nhà máy Tóm tắt sẽ phù hợp hơn với trường hợp sử dụng của bạn, có. – netcoder

1

Đây là một cách khác để bạn có thể nhìn vào nó:

Để xóa những bụi cây:
Một mô hình nhà máy là một mẫu creational. Đó là nó được sử dụng để tạo ra các cá thể để sử dụng.

Factory Pattern

  • Một mẫu creational nơi logic để tạo instance nằm trong tay của lớp Factory.
  • Mẫu nhà máy chỉ tạo một loại đối tượng đối tượng. Trong trường hợp của bạn, nó sẽ tạo ra các đối tượng kiểu LibraryObject giả định rằng LibraryObject là đối tượng cao nhất trong cây phân cấp.

Tóm tắt Pattern (Nhà máy của nhà máy)

  • Một mẫu creational nơi logic để tạo instance nằm trong tay của các lớp mà thực hiện Nhà máy giao diện /abstract class .
  • Mẫu nhà máy trừu tượng có thể tạo đối tượng thuộc nhiều loại khác nhau, vì vậy bạn có thể sử dụng triển khai cụ thể của giao diện Nhà máy/lớp trừu tượng để tạo đối tượng thuộc loại bạn muốn. Đó là lý do tại sao nó được gọi là một nhà máy của các nhà máy.

Một tài liệu tham khảo tốt sẽ liên kết này dưới đây, tôi sẽ đề nghị bạn đọc mô hình Nhà máy Phương pháp cũng như:
http://www.oodesign.com/creational-patterns/