php抽象工厂模式
来源:互联网 发布:大型网络3d手机游戏 编辑:程序博客网 时间:2024/06/05 00:10
CleverCode最近在看抽象工厂模式。
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
1 模式介绍
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
2 模式中的角色
3 模式结构
4 项目应用
4.1 客户可以根据自己的需求选择sqlserver数据库或者access数据库
4.2 类图.
4.3 php源码
<?php /** * 抽象工厂模式 * copyright (c) http://blog.csdn.net/CleverCode */class User{/*{{{*/ public $id; public $name; public function __construct($id,$name) { $this->id = $id; $this->name = $name; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; }}/*}}}*///操作User表class SqlServerUser{/*{{{*/ public function insert(User $user) { echo "SqlServer 向用户表插入一天记录。id:{$user->id},name:{$user->name}\r\n"; } public function getUser($id) { echo "SqlServer 获取用户id:{$id}记录\r\n"; }}/*}}}*/class AccessUser{/*{{{*/ public function insert(User $user) { echo " Access 向数据库用户表插入一天记录。id:{$user->id},name:{$user->name}\r\n"; } public function getUser($id) { echo " Access 获取用户id:{$id}记录\r\n"; }}/*}}}*///部门表class Dept{/*{{{*/ public $id; public $name; public function __construct($id,$name) { $this->id = $id; $this->name = $name; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; }}/*}}}*/class SqlServerDept{/*{{{*/ public function insert(Dept $dept) { echo "SqlServer 部门插入一天记录。id:{$dept->id},name:{$user->dept}\r\n"; } public function getUser($id) { echo "SqlServer 获取部门id:{$id}记录\r\n"; }}/*}}}*/class AccessDept{/*{{{*/ public function insert(Dept $dept) { echo " Access 部门表表插入一天记录。id:{$user->id},name:{$user->name}\r\n"; } public function getUser($id) { echo " Access 获取部门id:{$id}记录\r\n"; }}/*}}}*///抽象工厂abstract class DataOperate{/*{{{*/ abstract public function createUser(); abstract public function createDept();}/*}}}*///具体工厂accessclass DataAccess extends DataOperate{/*{{{*/ public function createUser() { return new AccessUser(); } public function createDept() { return new AccessDept(); }}/*}}}*///具体工厂SqlServerclass DataSqlServer extends DataOperate{/*{{{*/ public function createUser() { return new SqlServerUser(); } public function createDept() { return new SqlServerDept(); }}/*}}}*/class Client{/*{{{*/ //客户选择的db public static function getDataOperate($db) { $dataOperate = null; switch($db) { case 'Access': $dataOperate = new DataAccess(); break; case 'SqlServer': $dataOperate = new DataSqlServer(); break; } return $dataOperate; } public static function main($argv) { //客户选择db $dataOperate = self::getDataOperate('Access'); //插入一个新的用户 $user = new User(1,'张三'); $userDb = $dataOperate->createUser(); $userDb->insert($user); }}/*}}}*/Client::main($argv);?>
5 抽象工厂的改进
从上面的代码中可以看到,如果再增加一个mysql数据库,那么就会有一个具体的工厂。getOpersonData中的switch,就得加上一个分支。这里考虑使用反射技术,其中配置文件可以和反射配合使用。
改进源码如下。
<?php /** * 抽象工厂模式 * copyright (c) http://blog.csdn.net/CleverCode */class User{/*{{{*/ public $id; public $name; public function __construct($id,$name) { $this->id = $id; $this->name = $name; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; }}/*}}}*///操作User表class SqlServerUser{/*{{{*/ public function insert(User $user) { echo "SqlServer 向用户表插入一天记录。id:{$user->id},name:{$user->name}\r\n"; } public function getUser($id) { echo "SqlServer 获取用户id:{$id}记录\r\n"; }}/*}}}*/class AccessUser{/*{{{*/ public function insert(User $user) { echo " Access 向数据库用户表插入一天记录。id:{$user->id},name:{$user->name}\r\n"; } public function getUser($id) { echo " Access 获取用户id:{$id}记录\r\n"; }}/*}}}*///部门表class Dept{/*{{{*/ public $id; public $name; public function __construct($id,$name) { $this->id = $id; $this->name = $name; } public function setId($id) { $this->id = $id; } public function getId() { return $this->id; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; }}/*}}}*/class SqlServerDept{/*{{{*/ public function insert(Dept $dept) { echo "SqlServer 部门插入一天记录。id:{$dept->id},name:{$user->dept}\r\n"; } public function getUser($id) { echo "SqlServer 获取部门id:{$id}记录\r\n"; }}/*}}}*/class AccessDept{/*{{{*/ public function insert(Dept $dept) { echo " Access 部门表表插入一天记录。id:{$user->id},name:{$user->name}\r\n"; } public function getUser($id) { echo " Access 获取部门id:{$id}记录\r\n"; }}/*}}}*///抽象工厂(简单工厂+反射进行改进)class DataOperate{/*{{{*/ public $db; public function __construct() { $this->setDB($this->getDbConfig()); } public function setDB($db) { $this->db = $db; } //读取配置文件(使用配置文件配合反射) public function getDbConfig() { //读取配置 //..... return 'Access'; } function createTable($table) { //反射[db.table] $class = $this->db.$table; if(class_exists($class)) { return new $class(); } throw new Exception($class."类没有找到!"); }}/*}}}*/class Client{/*{{{*/ public static function main($argv) { //插入一个新的用户 $user = new User(1,'张三'); $dataOperate = new DataOperate(); $userDb = $dataOperate->createTable('User'); $userDb->insert($user); }}/*}}}*/Client::main($argv);?>
1 0
- php 抽象工厂模式
- PHP抽象工厂模式
- PHP 抽象工厂模式
- php抽象工厂模式
- php抽象工厂模式
- PHP工厂模式和抽象工厂模式
- php实现抽象工厂模式
- php之工厂模式和抽象工厂
- 【设计模式】之抽象工厂模式-PHP
- php设计模式 抽象工厂模式
- 初次接触php抽象工厂模式(Elgg)
- PHP设计模式——抽象工厂
- php,java实现抽象工厂模式
- PHP实现抽象工厂设计模式
- php设计模式之抽象工厂
- php 设计模式(抽象工厂)
- 工厂模式 -- 抽象工厂
- 工厂模式-抽象工厂
- 立一个flag,开启博客记录学习之路
- Bean named 'userDao' must be of type [cn.itcast.nsfw.user.dao.UserDao], but was actually of type [cn
- ucloud如何新建一个虚拟机以及注意的地方
- java 快速排序优化版
- Android 框架Dileber :二、HPref的使用
- php抽象工厂模式
- 根据内容重新加载datagridview
- 在线手册速查
- 1016. Phone Bills (25)
- 通信实验 动态分区存储管理方式的主存分配回收 查错
- ubuntu /elementary os下sublime text3 配置go开发环境
- 分支、循环语句
- ListFragment
- 支持各种主流支付通道,一码通刷