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设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...
随机推荐
- Spring Boot进阶系列三
Thymeleaf是官方推荐的显示引擎,这篇文章主要介绍怎么让spring boot整合Thymeleaf. 它是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要 ...
- c++primer(第五版) 阅读笔记_第1章
一.结构图: 二.代码及练习题 1.1节 编写一个简单的C++程序 1.1节练习 练习1.1: 查阅使用的编译器的文档:我使用的是vs2013,其文档为https://docs.microsoft.c ...
- 【07月01日】A股滚动市净率PB历史新低排名
2010年01月01日 到 2019年07月01日 之间,滚动市净率历史新低排名. 上市三年以上的公司,2019年07月01日市净率在30以下的公司. 来源:A股滚动市净率(PB)历史新低排名. 1 ...
- .net core中使用efcore
官网:https://docs.microsoft.com/zh-cn/aspnet/core/data/ef-mvc/intro?view=aspnetcore-2.2#register-the-s ...
- 规范化使用MySQL
如何更规范化使用MySQL 如何更规范化使用MySQL 背景:一个平台或系统随着时间的推移和用户量的增多,数据库操作往往会变慢:而在Java应用开发中数据库更是尤为重要,绝大多数情况下数据库的性能决定 ...
- WeakhashMap源码2
public class WeakHashMapIteratorTest { @SuppressWarnings({ "rawtypes", "unchecked&quo ...
- python入门之作用域
作用域的分类 1.全局作用域 全局可以调用的名字就存在于全局作用域 内置名称空间 + 全局名称空间 2.局部作用域 局部可以调用的名字就存放于局部作用域 局部名称空间 3. global 声明全局变量 ...
- 你读过的最好的 C++ 开源代码是什么?
LevelDb LevelDb是谷歌两位大神级别的工程师发起的开源项目,简而言之,LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++ 程序库.链接:google/level ...
- (9)ASP.NET Core 中的MVC路由二
1.URL生成 MVC应用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL链接. IUrlHelper 接口用于生成URL,是MVC与路由之间的基础部分.在控制器.视图和视图组件 ...
- List/Map 导出到表格(使用注解和反射)
Java 的 POI 库可以用来创建和操作 Excel 表格,有时候我们只需要简单地将 List 或 Map 导出到表格,样板代码比较多,不够优雅.如果能像 Gson 那样,使用注解标记要导出的属性, ...