php中的设计模式---工厂模式及单例模式
这两个练习放在一起处理。
在python中,这些模式都有的。
要记得三大类模式:创建型,结构型,行为型。
NotFoundException.php
<?php namespace Bookstore\Exceptions; use Exception; class NotFoundException extends Exception { } ?>
CustomerFactory.php
<?php namespace Bookstore\Domain; use Bookstore\Domain\Customer; use Exception; //又要记得这里的不得已,如果文件结构不按namespace组织,就要手工导入. //basic及premium这两行,抵消了工厂模式的优势了.:() require_once __DIR__ . '/Customer.php'; require_once __DIR__ . '/Basic.php'; require_once __DIR__ . '/Premium.php'; class CustomerFactory { public static function factory( string $type, int $id, string $firstname, string $surname, string $email ): Customer { /*这种写法,太个性,每次有新的分类,都要来这里更改 switch ($type) { case 'basic': return new Basic($id, $firstname, $surname, $email); case 'premium': return new Basic($id, $firstname, $surname, $email); } */ //只要存在类文件的,这里就可以自动适配.用指定类来初始化实例.如工厂模具一样造出来 $classname = __NAMESPACE__ . '\\' . ucfirst($type); if (!class_exists($classname)) { throw new Exception('Wrong type.'); } return new $classname($id, $firstname, $surname, $email); } } ?>
Config.php
<?php namespace Bookstore\Utils; use Bookstore\Exceptions\NotFoundException; require_once __DIR__ . '/NotFoundException.php'; class Config { private $data; //类静态变量,保证变量唯一性 private static $instance; //构造函数私有化,类外部不可以调用. private function __construct() { $json = file_get_contents(__DIR__ . '/app.json'); $this->data = json_decode($json, true); } //单例模式,保证只实例化一个类. public static function getInstance() { if (self::$instance == null) { //是可以自己实例化自己的. self::$instance = new Config(); } return self::$instance; } public function get($key) { if (!isset($this->data[$key])) { throw new NotFoundException("Key $key not in config."); } return $this->data[$key]; } } ?>
app.json
{ "db": { "user": "Luke", "password": "Skywalker" } }
test.php
<?php //使用命名空间,易于在大型应用中管理和组织php类. use Bookstor\Domain\Book; use Bookstore\Domain\Customer; use Bookstore\Domain\CustomerFactory; use Bookstore\Domain\Person; use Bookstore\Domain\Basic; use Bookstore\Domain\Premium; use Bookstore\Utils\Unique; use Bookstore\Utils\Config; use Bookstore\Exceptions\InvalidIdException; use Bookstore\Exceptions\ExceedeMaxAllowedException; //命名空间可以直接use,但如果这个命名空间没有在标准约定位置,且没有自动载入的话,需要使用require来手工定位一下. require_once __DIR__ . '/Unique.php'; require_once __DIR__ . '/Config.php'; require_once __DIR__ . '/Book.php'; require_once __DIR__ . '/Customer.php'; require_once __DIR__ . '/CustomerFactory.php'; require_once __DIR__ . '/Person.php'; require_once __DIR__ . '/Basic.php'; require_once __DIR__ . '/Premium.php'; require_once __DIR__ . '/InvalidIdException.php'; require_once __DIR__ . '/ExceedeMaxAllowedException.php'; $basic = CustomerFactory::factory('basic', 2, 'mary', 'poppins', 'mary@poppins.com'); echo $basic->getId(). '<br/>'; $config = Config::getInstance(); $dbConfig = $config->get('db'); var_dump($dbConfig); ?>
浏览器输出:
2 array(2) { ["user"]=> string(4) "Luke" ["password"]=> string(9) "Skywalker" }
php中的设计模式---工厂模式及单例模式的更多相关文章
- [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- PHP设计模式-工厂模式、单例模式、注册模式
本文参考慕课网<大话PHP设计模式>-第五章内容编写,视频路径为:http://www.imooc.com/video/4876 推荐阅读我之前的文章:php的设计模式 三种基本设计模式, ...
- php设计模式 工厂模式和单例模式
一.单例模式//让该类在外界无法造对象//让外界可以造一个对象,做一个静态方法返回对象//在类里面通过让静态变量控制返回对象只能是一个. 单例模式的要点有三个: 一是某个类只能有一个实例: 二是它必须 ...
- [Head First设计模式]抢票中的设计模式——代理模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式
1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...
- .NET设计模式: 工厂模式
.NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html .NET设计模式(1): ...
- Spring中如何使用工厂模式实现程序解耦?
目录 1. 啥是耦合.解耦? 2. jdbc程序进行解耦 3.传统dao.service.controller的程序耦合性 4.使用工厂模式实现解耦 5.工厂模式改进 6.结语 @ 1. 啥是耦合.解 ...
- 【设计模式】Java设计模式 -工厂模式
[设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...
随机推荐
- Redis内存回收策略
如果使用Redis的时候,不合理使用内存,把什么东西都放在内存里面,又不设置过期时间,就会导致内存的堆积越来越大.根据28法则,除了20%的热点数据之外,剩余的80%的非热点或不怎么重要的数据都在占用 ...
- Log4j Threshold指定输出等级&&Append指定是否追加内容
Threshold指定输出等级 有时候我们需要把一些报错ERROR日志单独存到指定文件 ,这时候,Threshold属性就派上用场了: Threshold属性可以指定日志level Log4j根据日志 ...
- 课后选做题-MyOD
课后选做题-MyOD od命令的了解 功能 od命令用于将指定文件内容以八进制.十进制.十六进制.浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符.od命令系统默 ...
- Hbase(一)了解Hbase与Phoenix
前言 HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Googl ...
- .net core 中的多环境配置
参考地址:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments?view=aspnetcore-2.2 官网说环 ...
- hanlp进行命名实体识别
需要安装jpype先,这个是python调用java库的桥梁. # -*- coding: utf-8 -*- """ Created on Thu May 10 09: ...
- 微信企业微信调试JS神器vConsole
在js页面上放以下代码 <script src='https://cdn.bootcss.com/vConsole/3.3.2/vconsole.min.js'></script&g ...
- JavaScript生成一个不重复的ID
/** * 生成一个用不重复的ID */ function GenNonDuplicateID():String{ } 先看看下面的几个方法 1.生成[0,1)的随机数的Math.random,例如 ...
- sitecore-多变量测试与A / B测试概念论述
sitecore-多变量检验和A / B检验的区别 A / B测试和多变量测试有什么区别?让我们来看看这些测试方法的方法,常见用途,优点和局限性. sitecore中A / B测试 A / B测试(您 ...
- Flutter 宽高比(比率)控件 AspectRatio
const AspectRatio({ Key key, @required this.aspectRatio, Widget child,}) void main() { runApp( n ...