ساختارها را میتوان راههای عملی بهتر و طراحی خوب در نظر گرفت. آنها راههای منعطف برای مشکلات معمول برنامهنویسی ارائه میدهد.
ساختار کارخانه به شما امکان نمونهسازی از اشیا در زمان اجرا میدهد. به آن نمونهسازی کارخانه گفته میشود زیرا اشیا را تولید مینماید. یک کارخانه پارامتردار نام کلاس را به عنوان آرگومان خود دریافت میدارد.
Example #1 متد پارامتردار کارخانه
<?php
class Example
{
// The parameterized factory method
public static function factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw new Exception('Driver not found');
}
}
}
?>
تعیین این متد در کلاس به درایورها اجازه میدهد تا کلاسها انتزاعی بسازند. اگر کلاس Example یک کلاس انتزاعی پایگاه داده باشد که یک درایورMySQL و SQLite را بارگذاری مینماید بصورت زیر است:
<?php
// Load a MySQL Driver
$mysql = Example::factory('MySQL');
// Load a SQLite Driver
$sqlite = Example::factory('SQLite');
?>
ساختار Singleton برای مقعیتهایی است که تنها باید یک نمونه از کلاس وجود داشته باشد. نمونه معمول این موضوع اتصال پایگاه داده است. پیادهسازی این ساختار به برنامهنویس این امکان را میدهد تا یک نمونه را براحتی برای بقیه اشیا قابل دسترسی نماید.
Example #2 تابع Singleton
<?php
class Example
{
// Hold an instance of the class
private static $instance;
// A private constructor; prevents direct creation of object
private function __construct()
{
echo 'I am constructed';
}
// The singleton method
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// Example method
public function bark()
{
echo 'Woof!';
}
// Prevent users to clone the instance
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
}
?>
این کد امکان دریافت یک نمونه از Example را مقدور میسازد.
<?php
// This would fail because the constructor is private
$test = new Example;
// This will always retrieve a single instance of the class
$test = Example::singleton();
$test->bark();
// This will issue an E_USER_ERROR.
$test_clone = clone $test;
?>