php 工厂模式实现类似java中的server层dao层
简单工厂
通过静态方法传入不同的参数创建不同的对象,实现对象创建和使用的分离
//示例1 最基本的工厂模式
<?php class mysql_conn{ private $dbh = null; private $host = 'localhost'; private $port = '3306'; private $user = 'root'; private $password = '****'; private $dbname = 'test'; public function __construct(){ $this->dbh = new PDO('mysql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbname, $this->user, $this->password); } public function get_table_data($table_name){ foreach($this->dbh->query("SELECT * from `$table_name`") as $row){ echo "<pre>"; print_r($row); echo "</pre>"; } } } class psql_conn{ private $dbh = null; private $host = 'localhost'; private $port = '5432'; private $user = 'postgres'; private $password = '****'; private $dbname = 'test'; public function __construct(){ $this->dbh = new PDO('pgsql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbname, $this->user, $this->password); } public function get_table_data($table_name){ foreach($this->dbh->query("SELECT * from `$table_name`") as $row){ echo "<pre>"; print_r($row); echo "</pre>"; } } public function custom_query($sql){ $stmt = $this->dbh->prepare($sql); $stmt->execute(); foreach ($stmt as $row) { echo "<pre>"; print_r($row); echo "</pre>"; } } } class Factory{ public static function pdo_conn($db = 'mysql'){ if ($db == 'mysql') { return new mysql_conn(); } else if ($db == 'psql'){ return new psql_conn(); } } } // mysql // $mysql_dbh = Factory::pdo_conn('mysql'); // $mysql_dbh->get_table_data('user'); // $mysql_dbh->get_table_data('order'); // postgresql // $psql_dbh = Factory::pdo_conn('psql'); // $psql_dbh->custom_query('select * from student');
// 开发模式之工程模式
// 工厂模式:
// 由工厂类根据参数来决定创建出哪一种产品类的实例;
// 工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。
// 工厂模式的最主要作用就是对象创建的封装、简化创建对象操作。
// 简单的说,就是调用工厂类的一个方法(传入参数)来得到需要的类;
//示例2 最基本的工厂模式
class Myname{
public function OutPutMyName(){
return 'name is rongyouyuan!~';
}
}
class NameFactory{
public static function Namefunc(){
return new Myname();
}
}
$obj=NameFactory::Namefunc();
echo $obj->OutPutMyName();
?>
抽象工厂
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。
<?php
interface database_option{
public function custom_query($sql);
public function get_table_data($table_name);
}
class mysql_conn implements database_option{
private $dbh = null;
private $host = 'localhost';
private $port = '3306';
private $user = 'root';
private $password = '****';
private $dbname = 'test';
public function __construct(){
$this->dbh = new PDO('mysql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbname, $this->user, $this->password);
}
public function get_table_data($table_name){
foreach($this->dbh->query("SELECT * from `$table_name`") as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
}
public function custom_query($sql){
$stmt = $this->dbh->prepare($sql);
$stmt->execute();
foreach ($stmt as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
}
}
class psql_conn implements database_option{
private $dbh = null;
private $host = 'localhost';
private $port = '5432';
private $user = 'postgres';
private $password = '****';
private $dbname = 'test';
public function __construct(){
$this->dbh = new PDO('pgsql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbname, $this->user, $this->password);
}
public function get_table_data($table_name){
foreach($this->dbh->query("SELECT * from `$table_name`") as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
}
public function custom_query($sql){
$stmt = $this->dbh->prepare($sql);
$stmt->execute();
foreach ($stmt as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
}
}
abstract class Factory{
abstract public static function create_mysql_conn();
abstract public static function create_psql_conn();
}
class db_Factory extends Factory{
public static function create_mysql_conn(){
return new mysql_conn();
}
public static function create_psql_conn(){
return new psql_conn();
}
}
// mysql
// $mysql_dbh = db_Factory::create_mysql_conn();
// $mysql_dbh->get_table_data('order');
// psql
// $psql_dbh = db_Factory::create_psql_conn();
// $psql_dbh->custom_query('select * from student');
php实现类似java中的Service层 DAO层
$adminInfo = ServiceFactory::getService(SrvType::COMMON_MERCHANT_ACCOUNT_ADMIN)->getInfoById($admin_id);
<?php
namespace lwmf\services;
/**
* 业务工厂,主要用于创建业务对象
*
*/
class ServiceFactory
{
/**
* 获取指定类型业务对象
*
* @param string $serviceType
* - SrvType定义的业务类型
* @return mixed
* @throws ServiceException
*/
public static function getService($serviceType)
{
if (self::$_srvImpls === NULL) {
// 初始化
self::init();
}
// 先在缓存服务中检查是否已经创建,如果有则直接返回
if (isset(self::$_services[$serviceType])) {
return self::$_services[$serviceType];
}
if (isset(self::$_tmpCaches[$serviceType])) {
throw new ServiceException("重复初始化service对象, type={$serviceType}");
}
// 创建指定业务对象
$srv = self::createService($serviceType);
// 缓存服务
if (LWM_APP_ID != 'unittest') {
self::$_services[$serviceType] = $srv;
self::$_tmpCaches[$serviceType] = 1;
}
return $srv;
}
/**
* 创建指定业务对象
*
* @param string $serviceType
* - SrvType定义的业务类型
* @return mixed
* @throws ServiceException
*/
private static function createService($serviceType)
{
/**
* 根据配置映射关系,创建实现类实例。
*/
if (!isset(self::$_srvImpls[$serviceType])) {
throw new ServiceException("It hasn't such a service type:" . $serviceType);
}
$class = '\lwm\services\modules' . self::$_srvImpls[$serviceType];
return new $class();
}
/**
* 初始化
*
* @throws \Exception
*/
private static function init()
{
$srvConfigPath = \Yii::app()->getProjectPath() . '/system/services/SrvImpsMapper.php';
if (!file_exists($srvConfigPath)) {
throw new ServiceException("services config not found, please init services's config");
}
// 加载业务实现映射
self::$_srvImpls = require $srvConfigPath;
}
/**
* 主要用于检测重复创建对象死循环
* @var array
*/
private static $_tmpCaches = [];
/**
* 业务实现映射
*
* @var array
*/
private static $_srvImpls = NULL;
/**
* 业务对象缓存
*
* @var array
*/
private static $_services = [];
}
SrvImpsMapper.php
<?php
use lwm\services\SrvType;
/**
* 业务实现配置
*/
return [
//店铺
SrvType::COMMON_SHOP => '\common\shop\imps\Shop',
SrvType::COMMON_SHOP_TYPE => '\common\shop\imps\ShopType',
SrvType::COMMON_SHOPTABLE => '\common\shop\imps\ShopTable',
SrvType::COMMON_SHOP_COLLECT => '\common\shop\imps\Collect',
。
。
。
];
SrvType.php
<?php
namespace lwm\services;
/**
* 业务类型定义
*
*/
class SrvType
{
/**
* 店铺业务
*/
const COMMON_SHOP = 'common.shop.Shop';
/**
* 店铺分类
*/
const COMMON_SHOP_TYPE = 'common.shop.ShopType';
/**
* 店铺桌位
*/
const COMMON_SHOPTABLE = 'common.shop.ShopTable';
}
业务路径如下

求知若饥,虚心若愚

浙公网安备 33010602011771号