练习案例:
/demo1.php
<?php
//命名空间
namespace w1205;
//单列模式原理
//创建类
class Demo1{
//构造方法 私有化
private function __construct()
{
}
//创建静态属性
public static $inst;
//实例化
public static function get(){
//判断返回当前类实例 没有就实例化 已经存在就返回他
if (is_null(self::$inst)){
self::$inst = new self();
// echo '111';
}return self::$inst;
}
//当前类禁用魔术克隆方法
private function __clone()
{
}
}
//实例化Demo1
$obj1 = Demo1::get();
$obj2 = Demo1::get();
var_dump($obj1,$obj2);
echo '<br>';
var_dump($obj1 === $obj2);
echo '<hr>';
/**********************************/
//单列模式应用场景
//创建类
class Db{
//构造方法 私有化
private function __construct(...$data)
{
//配置数据库基本资料
$dsn = $data[0];
$username = $data[1];
$password = $data[2];
self::$pdo = new \PDO($dsn,$username,$password);
}
//创建静态属性
public static $pdo;
//实例化
public static function get(...$data){
//判断返回当前类实例 没有就实例化 已经存在就返回他
if (is_null(self::$pdo)){
new self(...$data);
}return self::$pdo;
}
//当前类禁用魔术克隆方法
private function __clone()
{
}
}
//实例化Db
$data = ['mysql:host=127.0.0.1;dbname=phpcn','root','root66'];
$pdo = Db::get(...$data);
print_r($pdo->query('SELECT * FROM `user`')->fetchAll());
/demo2.php
<?php
//命名空间
namespace w1205;
//工厂模式 批量创建类的实例或对象
//创建类
class test1{
public function __construct($arg1)
{
echo '成功创建参数:' . $arg1;
}
}
class test2{
public function __construct($arg1,$arg2)
{
echo '成功创建参数:' . $arg1 . '---' . $arg2 ;
}
}
class test3{
public function __construct($arg1,$arg2,$arg3)
{
echo '成功创建参数:' . $arg1 . '---' . $arg2 . '---' . $arg3;
}
}
//工厂类
class Factory{
public static function create($name,...$data){
return new $name(...$data);
}
}
//使用工厂类实例化
Factory::create(test1::class,111);
Factory::create(test2::class,111,222);
Factory::create(test3::class,111,222,333);
/demo3.php
<?php
//命名空间
namespace w1205;
//依赖注入 用来解决对象调用之间的耦合
//工作类
class P{
//需要依赖外部对象
private $car;
//将注入点放到构造方法中
public function __construct(Car $car)
{
$this->car = $car;
}
//从外部对象执行操作
public function work(){
return $this->car->drive();
}
}
//需要依赖对的外部类
class Car{
public function drive(){
return '开车!!!';
}
}
//实例化类
$car = new Car();
$p = new P($car);
echo $p->work();
/M.PHP
<?php
//命名空间
namespace w1205;
//设置数据
class M{
public function get(){
return '中国';
}
}
/P.php
<?php
namespace w1205;
//数据
class P{
public function get(M $m){
return '我们是' . $m->get() .'人';
}
}
<?php
namespace w1205;
//容器类
class C{
//实例当前类容器
protected $inst = [];
//将类实例化的过程绑定到容器
public function bind($alias,\Closure $P){
$this->inst[$alias] = $P;
}
//取出保存在容器中的实例化过程闭包 执行
public function M($alias){
return $this->inst[$alias]();
}
}
/demo1.php
<?php
namespace w1205;
//调用文件
//不调用C容器类
require 'P.php';
require 'M.php';
//创建类
class Client1{
public function show(){
//创建P实例
$p = new P();
//创建M实例
$m = new M();
//将P注入到M中
return $p->get($m);
}
}
//客户端调用
echo (new Client1())->show();
/demo2.php
<?php
namespace w1205;
//引入文件
require 'P.php';
require 'M.php';
require 'C.php';
//创建类 使用容器 把实例化代码放到容器中
class Client2{
//输出P M
public function show(P $p,M $m){
return $p->get($m);
}
}
//将类实例绑定到容器中 并实例化返回
$c = new C();
//将实例化代码绑定到容器
$c->bind('P',function (){return new P();});
$c->bind('M',function (){return new M();});
$p = $c->M('P');
$m = $c->M('M');
echo (new Client2())->show($p,$m);
\inc\a.php
<?php
namespace base\inc;
class a{
public function du(){
return 'A类';
}
}
\inc\b.php
<?php
namespace base\inc;
class a{
public function du(){
return 'A类';
}
}
\inc\c.php
<?php
namespace base\inc;
class a{
public function du(){
return 'A类';
}
}
\auto.php
<?php
//自动加载技术
spl_autoload_register(function ($className){
$path = str_replace('\\', '/', $className);
require dirname(__DIR__) . DIRECTORY_SEPARATOR .$path . '.php';
});
\demo1.php
<?php
//工厂模式 实例
namespace base;
//use外部类名
use base\inc\a;
use base\inc\b;
use base\inc\c;
//引入自动加载文件
require __DIR__ . '\auto.php';
//创建类
class Travel1{
private $vehicle;
//构造方法
public function __construct($v)
{
//设置判断
switch (strtolower($v)){
case 'a':
$this->vehicle = new a();
break;
case 'b':
$this->vehicle = new b();
break;
case 'c':
$this->vehicle = new c();
}
}
//调用外部依赖对象
public function t(){
return $this->vehicle->du() .'装备';
}
}
//调用
echo (new Travel1('a'))->t(),'<hr>';
echo (new Travel1('b'))->t(),'<hr>';
echo (new Travel1('c'))->t(),'<hr>';
\demo2.php
<?php
//工厂模式 实例
namespace base;
//use外部类名
use base\inc\a;
use base\inc\b;
use base\inc\c;
//引入自动加载文件
require __DIR__ . '\auto.php';
//工厂类
class F{
protected static $inst;
public static function get($v){
switch (strtolower($v)){
case 'a':
self::$inst =new a();
break;
case 'b':
self::$inst =new b();
break;
case 'c':
self::$inst =new c();
}
return self::$inst;
}
}
//创建类
class Travel2{
private $vehicle;
//构造方法
public function __construct($v)
{
$this->vehicle = F::get($v);
}
//
// public function __construct($v)
// {
// //设置判断
// switch (strtolower($v)){
// case 'a':
// $this->vehicle = new a();
// break;
// case 'b':
// $this->vehicle = new b();
// break;
// case 'c':
// $this->vehicle = new c();
// }
// }
//调用外部依赖对象
public function t(){
return $this->vehicle->du() .'装备!';
}
}
//调用
echo (new Travel2('a'))->t(),'<hr>';
echo (new Travel2('b'))->t(),'<hr>';
echo (new Travel2('c'))->t(),'<hr>';
/demo3.php
<?php
namespace base;
//引用
use base\incs\a;
use base\incs\b;
use base\incs\c;
use base\incs\iV;
require __DIR__ . '/auto.php';
class demo3{
private $vehicle;
public function __construct(iV $vehicle)
{
$this->vehicle = $vehicle;
}
public function travelModel(){
return $this->vehicle->du() . '装备!!!';
}
}
echo (new demo3(new a()))->travelModel(), '<br>';
echo (new demo3(new b()))->travelModel(), '<br>';
echo (new demo3(new c()))->travelModel(), '<br>';
手写
总结
单例模式:设置类中唯一实例 通过判断禁止出现一个类 多个实例
工厂模式:通过数据调入批量创建多个统一规范的类实例/对象