大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
PHP工厂模式:
php设计模式笔记,第二个是工厂模式。工厂,我们就可以联想到是一座房子,里面有N多车间,生产着不同系列的产品。我们如果是采购的话,要看什么产品,工厂很快从随便从其中一个车间拿出一个就解决,不会影响其他车间的工作,各自分工明确。在复杂的情况,也简单化了。php里面的工厂模式,也类似,由一个类,看作是工厂,在类里面构造一个对外方法接口,返回不同类型的类实例。
工厂模式的好处:在复杂情况中,可以非常方便扩展类。例如数据库工厂,就是用了这种模式,可以不影响其他数据库访问类型的前提下,扩展其他数据库操作api类。
/**
* PHP设计模式 之 工厂模式
*/
interface IEat{
public function showFoot();
}
class Morning implements IEat{
public function showFoot(){
echo '早餐菜单: 豆浆+油条+面包';
}
}
class Noon implements IEat{
public function showFoot(){
echo '午餐菜单: 蒸饭+烧鸭+可乐';
}
}
class Night implements IEat{
public function showFoot(){
echo '晚餐菜单: 披萨套餐';
}
}
class Bedtime implements IEat{
public function showFoot(){
echo '夜宵菜单: 绿豆汤';
}
}
class Noeat implements IEat{
public function showFoot(){
echo '不着调时间,没有东西吃';
}
}
class EatFactory {
public static function factory($hh=''){
$h= ($hh) ? $hh:date('H');
if($h>6 && $h<9){$c= 'Morning';}
else if($h>=11 && $h<14){$c='Noon';}
else if ($h>=17 && $h < 21){$c='Night';}
else if ($h>=22 && $h< 24) {$c='Bedtime';}
else {$c='Noeat';}
return new $c();
}
}
///demo code
$eat01 = EatFactory::factory();
$eat01->showFoot();
$eat02 = EatFactory::factory(7);
$eat02->showFoot();
$eat03 = EatFactory::factory(12);
$eat03->showFoot();
$eat04 = EatFactory::factory(22);
$eat04->showFoot();
var_dump($eat01);
var_dump($eat02);
var_dump($eat03);
var_dump($eat04);
//输出日志
午餐菜单: 蒸饭+烧鸭+可乐
早餐菜单: 豆浆+油条+面包
午餐菜单: 蒸饭+烧鸭+可乐
夜宵菜单: 绿豆汤
object(Noon)#1 (0) { }
object(Morning)#2 (0) { }
object(Noon)#3 (0) { }
object(Bedtime)#4 (0) { }
PHP抽象工厂模式:
而抽象工厂模式设计的名词:产品族、产品等级。初步接触理解起来比较容易混淆,如果通俗的理解是,一个工厂可以看成是一个产品族,而产品族可以由多个产品等级(既产品系列)组成,而一个产品等级可以有具体的产品。
测试数据,苹果:手机iphone5,平板电脑ipad 4;三星:手机I9300,平板电脑GALAXY Note 10.1。
结合抽象工厂模式的名词对照关系如下:
产品族:苹果,三星
产品等级:手机,平板电脑
具体产品:iphone 5、ipad4 ,I9300、GALAXY Note 10.1
php如何实现这种模式:首先要用一个接口类来罗列有多少个抽象产品实现的方法;然后有多少个产品族就有多少个工厂类,分别继承接口类,实现接口类,负责创建产品类的实例化。最后我们实现产品类,同类产品族的具体产品类都会有实现一个公共的产品接口接口类。
代码演示,实现抽象工厂模式:
/**
* PHP设计模式 之 抽象工厂模式
*
*/
interface IAbsFactory {
public function showLastNewMobile();
public function showLastNewComputer();
}
class AppleFactory implements IAbsFactory {
public function showLastNewMobile(){
return new AppleLastNewMobile();
}
public function showLastNewComputer(){
return new AppleLastNewComputer();
}
}
interface IAppleProduct {
public function getSystemVersion();
public function getName();
public function getPrice();
}
class AppleLastNewMobile implements IAppleProduct {
public function getSystemVersion(){
echo 'iOS 6.0';
}
public function getName(){
echo 'iphone 5';
}
public function getPrice() {
echo '5288 RMB';
}
}
class AppleLastNewComputer implements IAppleProduct {
public function getSystemVersion(){
echo 'iOS 6';
}
public function getName(){
echo 'ipad 4';
}
public function getPrice() {
echo '3688 RMB';
}
}
class SamsungFactory implements IAbsFactory {
public function showLastNewMobile() {
return new SamsungLastNewMobile();
}
public function showLastNewComputer(){
return new SamsungLastNewComputer();
}
}
interface ISamsungProduct {
public function getSystemVersion();
public function getName();
public function getPrice();
}
class SamsungLastNewMobile implements ISamsungProduct {
public function getSystemVersion(){
echo 'Android 4.0';
}
public function getName(){
echo 'I9300';
}
public function getPrice(){
echo '4,699 RMB';
}
}
class SamsungLastNewComputer implements ISamsungProduct {
public function getSystemVersion(){
echo 'Android 4.0';
}
public function getName(){
echo 'GALAXY Note 10.1';
}
public function getPrice(){
echo '3,800 RMB';
}
}
/**
* 产品族 - 苹果
*/
$apple = new AppleFactory();
//打印最新手机产品
$iphone = $apple->showLastNewMobile();
$iphone->getName();
$iphone->getPrice();
$iphone->getSystemVersion();
//打印最新平板电脑
$ipad = $apple->showLastNewComputer();
$ipad->getName();
$ipad->getPrice();
$ipad->getSystemVersion();
/**
* 产品族 - 三星
*/
$samsung = new SamsungFactory();
//打印最新手机产品
$samsungMob = $samsung->showLastNewMobile();
$samsungMob->getName();
$samsungMob->getPrice();
$samsungMob->getSystemVersion();
//打印最新平板电脑
$samsungIpad = $samsung->showLastNewComputer();
$samsungIpad->getName();
$samsungIpad->getPrice();
$samsungIpad->getSystemVersion();
//输入结果
iphone 5
5288 RMB
iOS 6.0
ipad 4
3688 RMB
iOS 6
-------------------------------------
I9300
4,699 RMB
Android 4.0
GALAXY Note 10.1
3,800 RMB
Android 4.0
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164370.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...