(ví dụ: nếu chúng chứa các tham chiếu theo chu kỳ) [...] Để thực hiện điều này, người ta có thể có các hàm tạo có thể tạo nhiều hơn một đối tượng. Sau đó, lập trình viên sẽ đưa vào một hàm tạo duy nhất tất cả các mã đảm bảo rằng, một khi các đối tượng o1, ..., đã được tạo,
Phụ thuộc tuần hoàn giữa các đối tượng? Sau đó, câu trả lời là "không sử dụng (chỉ) một nhà xây dựng", bởi vì các cuộc gọi phương thức tuần hoàn không có ý nghĩa gì. Thay vào đó, đây là một kịch bản cổ điển cho một số phương thức Factory .
Đây là một ví dụ (trong PHP) là một thứ ngớ ngẩn nhưng minh họa ý tưởng chung: Bạn không thể tạo một cái Sprocket
mà không có liên kết Widget
và ngược lại. Mỗi đối tượng có một tham chiếu đến đối tượng khác khi nó trở nên có sẵn.
class Widget {
protected $sprocket = null;
public function getSprocket(){ return $this->sprocket; }
protected function __construct(){
// Constructor cannot be called from outside, not public
// Initialize self, to a limited degree
}
public static function create(Sprocket $partner=null){
$me = new Widget(); // Can call constructor from same class
// Here we can make all sorts of changes and additions and other
// objects, wiring them all together, before revealing the result
// to the outside world.
if($partner !== null){
$me->sprocket = $partner;
}else{
$me->sprocket = Sprocket::create($me);
}
return $me;
}
}
/*
* Practically identical to Widget, just with some renaming
*/
class Sprocket {
protected $widget = null;
public function getWidget(){ return $this->widget; }
protected function __construct(){ }
public static function create(Widget $partner=null){
$me = new Sprocket();
if($partner !== null){
$me->widget = $partner;
}else{
$me->widget = Widget::create($me);
}
return $me;
}
}
/*
$mw = new Widget(); // NOT ALLOWED! Constructor not public
*/
$w = Widget::create(); // OK to call
$s = $w->getSprocket();
$w2 = $s->getWidget();
assert($w == $w2);
Nếu tôi phải làm điều này trong PHP 5.2 ngoài đời thực, tôi chỉ cần để công khai các hàm tạo và bảo mọi người không sử dụng chúng . Thay vào đó tôi có một makeWidgetWithSprocket()
chức năng. Nếu ngôn ngữ là Java, tôi sẽ sử dụng các điều khiển khả năng hiển thị ở cấp độ gói để tránh thêm lỗi.
Đọc thêm:
- Nếu bạn muốn chuyển nhiều tùy chọn và cài đặt cho
create()
, hãy xem xét mẫu Builder .
- Nếu bạn thấy mình cần rất nhiều sự linh hoạt để sắp xếp lại mọi thứ theo nhiều cách khác nhau, hãy xem Inversion of Control framework, thường sử dụng (nhưng không phải luôn luôn) sử dụng phép nội xạ phụ thuộc để kết nối các đối tượng với nhau "từ bên ngoài".
factory
mẫu.