php 常用设计模式demo
生活随笔
收集整理的這篇文章主要介紹了
php 常用设计模式demo
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<?php
//__get()
//__set()當對象中屬性不存在時調用該魔術方法
//__call()當對象中方法不存在時
//__callStatic()靜態方法
//__string()當對象不能轉換成字符串時使用__string()
//__invoke()對象不能直接當成一個函數使用
//工廠模式,是有一個工廠創建類,通過工廠調用:: 工廠方法或者類生成對象,而不是在代碼中直接new
//單例模式,一個類只有一個對象,例如要連接數據庫使用一次就可以了,使某個類的對象僅允許創建一次
//注冊模式,全局共享和交換對象
//單例設計模式
//設計模式講究對象之間關系的抽象
//單例模式只有自己一個對象
//單例模式應用場景:
//1.應用程序與數據庫交互
// 使用單例模式可以避免大量的new操作,每次new操作都會消耗內存資源和系統資源
//2.控制配置信息
//系統中需要有一個類來全局控制某些配置信息
//策略模式
//策略模式,將一組特定的行為和算法封裝成類,以適應某些特定的上下文環境,
//實例:加入一個電商網站,針對男性女性用戶要跳轉到不同的電商類目,并且所有的廣告位展示不同的廣告
//可以實現Ioc,依賴導致,控制反轉
/**
* 工廠模式例1
*/
interface person{
public function say();
}
class man implements person{
public function say(){
echo "我是男生<br>";
}
}
class woman implements person{
public function say(){
echo "我是女生<br>";
}
}
class simpleFactoty{
static function createman(){
return new man();
}
static function createwoman(){
return new woman();
}
}
$man = simpleFactoty::createman();
$man->say();
$woman = simpleFactoty::createwoman();
$woman->say();
/**
* 工廠模式例2
*/
interface transport{
public function go();
}
class bike implements transport{
public function go(){
echo "bike跑的慢<br>";
}
}
class car implements transport{
public function go(){
echo "car開的快<br>";
}
}
class bus implements transport{
public function go(){
echo "bus每一站都要停<br>";
}
}
class transFactory{
public static function factory($transport){
switch($transport){
case 'bike':
return new bike();
break;
case 'car':
return new car();
break;
case 'bus':
return new bus();
break;
}
}
}
$transport = transFactory::factory('car');
$transport->go();
/**
* 單例模式例1
*/
class Single {
private $name;//聲明一個私有的實例變量
private function __construct(){//聲明私有構造方法為了防止外部代碼使用new來創建對象。
}
static public $instance;//聲明一個靜態變量(保存在類中唯一的一個實例)
static public function getinstance(){//聲明一個getinstance()靜態方法,用于檢測是否有實例對象
if(!self::$instance)
self::$instance = new self();
return self::$instance;
}
public function setname($n){
$this->name = $n;
}
public function getname(){
return $this->name;
}
}
$oa = Single::getinstance();
$ob = Single::getinstance();
$oa->setname('hello world');
$ob->setname('good morning'.'<br>');
echo $oa->getname();//good morning
echo $ob->getname();//good morning
/**
* 單例模式例2
*/
class uni{
static private $instance;//創建靜態私有的變量保存該類對象
private $config;//參數
private function __construct($config){
$this->config = $config;
echo "我被實例化了";
}
private function __clone(){
}
//提供一個訪問這個實例的公共的靜態方法(通常為getInstance方法),從而返回唯一實例的一個引用
static public function getInstance($config){//判斷$instance是否是UNI的對象
if(!self::$instance instanceof self){//判斷一個對象是否是某個類的實例
self::$instance = new self($config);
}
return self::$instance;
}
public function getName(){
echo $this->config;
}
}
$db1 = uni::getInstance(1);
$db1->getName();
echo "<br>";
$db2 = uni::getInstance(4);
$db2->getName();
echo "<br>";
/**
* 單例模式例3
*/
class pzhang{
static private $instance;
private $config;
private function __construct($config){
$this->config = $config;
echo "我被實例化了";
}
private function __clone(){
}
static public function getInstance($config){
if(!self::$instance instanceof self)
self::$instance = new self($config);
return self::$instance;
}
public function getname(){
echo $this->config;
}
}
$adb = pzhang::getInstance(1);
$adb->getname();
echo "<br>";
/**
* 策略模式
*/
interface baseAgent{//抽象策略角色
public function do_method();
}
class ConcreteStrategyA implements baseAgent{//具體策略角色
public function do_method(){
echo "do method a";
}
}
class ConcreteStrategyB implements baseAgent{//具體策略角色
public function do_method(){
echo "do method b";
}
}
class ConcreteStrategyC implements baseAgent{//具體策略角色
public function do_method(){
echo "do method b";
}
}
class Question{ // 環境角色
private $__strategy;
public function __construct(BaseAgent $baseAgent) {
$this->__strategy = $baseAgent;
}
public function handle_question() {
$this->__strategy->do_method();
}
}
$strategyA = new ConcreteStrategyA();
$question = new Question($strategyA);
$question->handle_question();//輸出do method A
$strategyB = new ConcreteStrategyB();
$question = new Question($strategyB);
$question->handle_question();//輸出do method B
$strategyC = new ConcreteStrategyC();
$question = new Question($strategyC);
$question->handle_question();//輸出do method C
echo "<br>";
/**
* 策略模式
*/
interface pzhangt{//抽象策略角色
public function say();
}
class A implements pzhangt{//具體策略角色
public function say(){
echo "說see you";
}
}
class B implements pzhangt{
public function say(){
echo "說 good bay";
}
}
class questiont{
private $test;
public function __construct(Pzhangt $pzhangt){
$this->test = $pzhangt;
}
public function handle(){
$this->test->say();
}
}
$a = new A();
$res = new questiont($a);
$res->handle();
$b = new B();
$res = new questiont($b);
$res->handle();
?>
//__get()
//__set()當對象中屬性不存在時調用該魔術方法
//__call()當對象中方法不存在時
//__callStatic()靜態方法
//__string()當對象不能轉換成字符串時使用__string()
//__invoke()對象不能直接當成一個函數使用
//工廠模式,是有一個工廠創建類,通過工廠調用:: 工廠方法或者類生成對象,而不是在代碼中直接new
//單例模式,一個類只有一個對象,例如要連接數據庫使用一次就可以了,使某個類的對象僅允許創建一次
//注冊模式,全局共享和交換對象
//單例設計模式
//設計模式講究對象之間關系的抽象
//單例模式只有自己一個對象
//單例模式應用場景:
//1.應用程序與數據庫交互
// 使用單例模式可以避免大量的new操作,每次new操作都會消耗內存資源和系統資源
//2.控制配置信息
//系統中需要有一個類來全局控制某些配置信息
//策略模式
//策略模式,將一組特定的行為和算法封裝成類,以適應某些特定的上下文環境,
//實例:加入一個電商網站,針對男性女性用戶要跳轉到不同的電商類目,并且所有的廣告位展示不同的廣告
//可以實現Ioc,依賴導致,控制反轉
/**
* 工廠模式例1
*/
interface person{
public function say();
}
class man implements person{
public function say(){
echo "我是男生<br>";
}
}
class woman implements person{
public function say(){
echo "我是女生<br>";
}
}
class simpleFactoty{
static function createman(){
return new man();
}
static function createwoman(){
return new woman();
}
}
$man = simpleFactoty::createman();
$man->say();
$woman = simpleFactoty::createwoman();
$woman->say();
/**
* 工廠模式例2
*/
interface transport{
public function go();
}
class bike implements transport{
public function go(){
echo "bike跑的慢<br>";
}
}
class car implements transport{
public function go(){
echo "car開的快<br>";
}
}
class bus implements transport{
public function go(){
echo "bus每一站都要停<br>";
}
}
class transFactory{
public static function factory($transport){
switch($transport){
case 'bike':
return new bike();
break;
case 'car':
return new car();
break;
case 'bus':
return new bus();
break;
}
}
}
$transport = transFactory::factory('car');
$transport->go();
/**
* 單例模式例1
*/
class Single {
private $name;//聲明一個私有的實例變量
private function __construct(){//聲明私有構造方法為了防止外部代碼使用new來創建對象。
}
static public $instance;//聲明一個靜態變量(保存在類中唯一的一個實例)
static public function getinstance(){//聲明一個getinstance()靜態方法,用于檢測是否有實例對象
if(!self::$instance)
self::$instance = new self();
return self::$instance;
}
public function setname($n){
$this->name = $n;
}
public function getname(){
return $this->name;
}
}
$oa = Single::getinstance();
$ob = Single::getinstance();
$oa->setname('hello world');
$ob->setname('good morning'.'<br>');
echo $oa->getname();//good morning
echo $ob->getname();//good morning
/**
* 單例模式例2
*/
class uni{
static private $instance;//創建靜態私有的變量保存該類對象
private $config;//參數
private function __construct($config){
$this->config = $config;
echo "我被實例化了";
}
private function __clone(){
}
//提供一個訪問這個實例的公共的靜態方法(通常為getInstance方法),從而返回唯一實例的一個引用
static public function getInstance($config){//判斷$instance是否是UNI的對象
if(!self::$instance instanceof self){//判斷一個對象是否是某個類的實例
self::$instance = new self($config);
}
return self::$instance;
}
public function getName(){
echo $this->config;
}
}
$db1 = uni::getInstance(1);
$db1->getName();
echo "<br>";
$db2 = uni::getInstance(4);
$db2->getName();
echo "<br>";
/**
* 單例模式例3
*/
class pzhang{
static private $instance;
private $config;
private function __construct($config){
$this->config = $config;
echo "我被實例化了";
}
private function __clone(){
}
static public function getInstance($config){
if(!self::$instance instanceof self)
self::$instance = new self($config);
return self::$instance;
}
public function getname(){
echo $this->config;
}
}
$adb = pzhang::getInstance(1);
$adb->getname();
echo "<br>";
/**
* 策略模式
*/
interface baseAgent{//抽象策略角色
public function do_method();
}
class ConcreteStrategyA implements baseAgent{//具體策略角色
public function do_method(){
echo "do method a";
}
}
class ConcreteStrategyB implements baseAgent{//具體策略角色
public function do_method(){
echo "do method b";
}
}
class ConcreteStrategyC implements baseAgent{//具體策略角色
public function do_method(){
echo "do method b";
}
}
class Question{ // 環境角色
private $__strategy;
public function __construct(BaseAgent $baseAgent) {
$this->__strategy = $baseAgent;
}
public function handle_question() {
$this->__strategy->do_method();
}
}
$strategyA = new ConcreteStrategyA();
$question = new Question($strategyA);
$question->handle_question();//輸出do method A
$strategyB = new ConcreteStrategyB();
$question = new Question($strategyB);
$question->handle_question();//輸出do method B
$strategyC = new ConcreteStrategyC();
$question = new Question($strategyC);
$question->handle_question();//輸出do method C
echo "<br>";
/**
* 策略模式
*/
interface pzhangt{//抽象策略角色
public function say();
}
class A implements pzhangt{//具體策略角色
public function say(){
echo "說see you";
}
}
class B implements pzhangt{
public function say(){
echo "說 good bay";
}
}
class questiont{
private $test;
public function __construct(Pzhangt $pzhangt){
$this->test = $pzhangt;
}
public function handle(){
$this->test->say();
}
}
$a = new A();
$res = new questiont($a);
$res->handle();
$b = new B();
$res = new questiont($b);
$res->handle();
?>
轉載于:https://www.cnblogs.com/isuansuan/p/9755509.html
總結
以上是生活随笔為你收集整理的php 常用设计模式demo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript字符串操作方法大全,
- 下一篇: MaBatis(5)输入/输出映射