1单例模式
当需要保证某个对象只能有一个实例的时候,单例模式非常有用。它把创建对象的控制权委托到一个单一的点上,任何时候应用程序都只会仅有一个实例存在。单例类不应该可以在类的外部进行实例化一个单例类应该具备以下几个要素。
必须拥有一个访问级别为 private 的构造函数,有效防止类被随意实例化。
必须拥有一个保存类的实例的静态变量。
必须拥有一个访问这个实例的公共的静态方法,该方法通常被命名为 GetInstance()。
必须拥有一个私有的空的clone方法,防止实例被克隆复制。
class ClassName
{
public static $_instance;
public $a;
private function __construct($name)
{
$this->a = $name;
}
private function __clone()
{
// TODO: Implement __clone() method.
}
public static function GetInstrance($item)
{
if(self::$_instance){
return self::$_instance;
}else{
self::$_instance = new ClassName($item);
return self::$_instance;
}
}
public function GetValue()
{
echo $this->a;
}
}
$obj = ClassName::GetInstrance(4);
$obj -> GetValue();
echo "<br/>";
$obj = ClassName::GetInstrance(2);
$obj -> GetValue();
工厂模式
1、抽象类不能被实例化
2、抽象类不一定有抽象方法;有抽象方法的类一定是抽象类
3、抽象类中的抽象方法在子类中必须定义
abstract class PizzaStore
{
public abstract function createPizza($type);
public function orderPizza($type)
{
$pizza = $this->createPizza($type);
echo "食物名称:".$pizza->name."\n";
echo "制作方法:".$pizza->make()."\n";
echo "包装方式:".$pizza->box()."\n";
}
}
class PizzaA extends PizzaStore
{
public function createPizza($type)
{
if($type == "aa"){
return new PizzaAa();
}else{
return null;
}
}
}
class PizzaB extends PizzaStore
{
public function createPizza($type)
{
if($type == "bb"){
return new PizzaBb();
}else{
return null;
}
}
}
abstract class Pizza
{
public $name;
public abstract function make();
public abstract function box();
}
class PizzaAa extends Pizza
{
public $name = "a型披萨";
public function make()
{
return "做法一";
}
public function box()
{
return "包装一";
}
}
class PizzaBb extends Pizza
{
public $name = "b型披萨";
public function make()
{
return "做法二";
}
public function box()
{
return "包装二";
}
}
$pizza = new PizzaA();
$pizza -> orderPizza('aa');
echo "<br/>";
$pizza = new PizzaB();
$pizza -> orderPizza('bb');