php设计模式中工厂模式和php单例模式三私一公的区别

正文 php设计模式之单例模式、工厂模式与观察者模式
php设计模式之单例模式、工厂模式与观察者模式
发布时间: & 编辑:www.jquerycn.cn
本文介绍下,php设计模式中的三种模式,分别是单例模式、工厂模式与观察者模式,有需要的朋友参考下。面向对象是PHP5之后增加的功能,是PHP走向现代语言的一个标志。
在过程式设计时代,PHP以学习成本低、入门快的特点赢得很多WEB开发者的青睐,但同时也限制了PHP的发展。
借鉴Java和C++之后的PHP语言,在增加面向对象特性的同时,还保持着简便易懂的特点。
但是,如果只是使用了PHP的继承特性,并不是面向对象的设计,因为这并不能提高代码的重用性和灵活性。
不论是 PHP、Java还是C++编程语言,在编程的时候,我们所遇到的大部分问题,其实都已经被其他程序员一再的处理了。
设计模式提取了共同问题,定义了经过测试的解决方案,并描述了可能的结果。
也就是说,设计模式(Patterns)是一些可以在项目中重复使用的解决方案。
但是,设计模式并非像组件那样,能被合并来构建系统的固定的解决方案,它们是解决一般性问题的通用方法。
通俗来说,设计模式就是一些编程的套路,不是具体的攻防动作,是为设计更好系统设计的解决方案。
面向对象的原则是“组合优于继承”,因为组合可以以多种方式动态的处理任务。
虽然对象的组合会导致代码的可读性下降,但会让系统更加灵活,复用性更高。
设计模式是很多前辈花费大量精力总结的经验,是经过检验的高效的一系列对象组合方式。
市面上的设计模式介绍大部分是Java语言,本文特地整理一份PHP版的设计模式。
共12种经典的设计模式:
参考资料:现在位置:
本文实例讲述了PHP设计模式之工厂模式与单例模式实现方法。分享给大家供大家参考,具体如下:
设计模式简单说应对某类问题而设计的解决方式
工厂模式:应对需求创建相应的对象
class factory{
function __construct($name){
if(file_exists('./'.$name.'.class.php')){
return new $
die('not exist');
单例模式:只创建一个对象的实例,不允许再创建实例,节约资源(例如数据库的连接)
class instance{
public $val = 10;
private static $
private function __construct(){}
private function __clone(){}
//设置为静态方法才可被类调用
public static function getInstance(){
/*if(!isset(self::$instance)){
self::$instance =
if(!isset(instance::$instance)){
instance::$instance =
return instance::$
}}$obj_one = instance::getInstance();$obj_one-&val = 20;//clone可以调用__clone()克隆即new出一个新的的对象//$obj_two = clone $obj_$obj_two = instance::getInstance();echo $obj_two-&echo '&p&';var_dump($obj_one,$obj_two);
运行结果如下:
20object(instance)[1] public 'val' =& int 20object(instance)[1] public 'val' =& int 20
应用:数据库连接类(database access oject)
class mysqldb{
private $arr = array(
'port' =& 3306,
'host' =& 'localhost',
'username' =& 'root',
'passward' =& 'root',
'dbname' =& 'instance',
'charset' =& 'utf8'
private function __clone(){}
private function __construct(){
$this-&link = mysql_connect($this-&arr['host'],$this-&arr['username'],$this-&arr['passward']) or die(mysql_error());
mysql_select_db($this-&arr['dbname']) or die('db error');
mysql_set_charset($this-&arr['charset']);
static public function getInsance(){
if(!isset(mysqldb::$instance)){
mysqldb::$instance =
return mysqldb::$
public function query($sql){
if($res = mysql_query($sql)){
//fetch one
public function get_one($sql){
$res = $this-&query($sql);
if($result = mysql_fetch_row($res)){
return $result[0];
//fetch row
public function get_row($sql){
$res = $this-&query($sql);
if($result = mysql_fetch_assoc($res)){
//fetch all
public function get_all($sql){
$res = $this-&query($sql);
$arr = array();
while($result = mysql_fetch_assoc($res)){
$arr[] = $
}}$mysql = mysqldb::getInsance();
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。博客分类:
一、工厂模式
1.简单工厂模式
也叫静态工厂模式,一般是产品的继承类或是接口的实现,如司机开多个车子的例子。
//接口
public Interface Car{
&&&& public void driver();
}
//定义接口的实现类
public class QQCar implements Car{
public void driver(){
sysout("QQ driver");
public class BaoMaCar{
public void driver(){
sysout("BaoMa driver");
}
}
//定义工厂类
public class Driver{
public static final String QQ_CAR = "QQCar";
public static& final String BAOMA_CAR="BaoMaCar";
public static Car productCar(String name){
if(name.equalsIgnoreCase("QQCar"){
return new QQCar();
if(name.equalsIgnoreCase("BaoMaCar"){
return new BaoMaCar();
}
}
//调用工厂创建所需对象
public static void main(String[] args){
Car qqCar = Driver.productCar(Driver.QQ_CAR);
qqCar.driver();
}
总结:简单工厂模式就是达到老板告诉司机我坐QQ车还是做其他车,其余的都交给司机去做。main方法调用出就相当于是老板下达命令。
&&&& 优点:工厂类需要返回抽象的产品类型即Car。
&&&&&&&&& 该模式避免了直接创建产品对象的责任。而仅仅是消费该产品就可以了。
&&&& 缺点:当添加了一个新的车时,虽然新的调用处置需要告诉司机开心添加的车就可以了,但是工厂类需要添加对应开新车的业务逻辑判断。这样就违背了开闭原则。
&&&&&&&&& 新添加车时工厂类是被动的。这样的工厂类被称为全能类。所有车都由一个司机管理会把司机类坏的。
2.工厂方法模式
//注:渴望某个方法被子类实现那么父类的这个方法就不能定义成static和final的。
工厂方法模式去掉了简单工厂模式的static,这样使得它可以被子类继承,这样父工厂的压力就可以由子工厂进行分担了。
组成部分:
a.抽象工厂,子工厂必须继承或是实现父类。与应用程序无关。
b.子工厂,它包含与具体业务逻辑相关的代码。有应用程序调用以创建具体的产品。
c.抽象产品
d.具体产品角色
例子:
//抽象产品和具体产品如上
//抽象工厂
public interface Driver{
public Car driverCar();
}
//抽象工厂的子类,一个子类管理一辆车
public class QQDriver implements Driver{
public Car driverCar(){
return new QQCar();
}
}
//抽象工厂的子类,一个子类管理一辆车
public class BaoMaDriver implements Driver{
public Car driverCar() {
return new BaoMaCar();
}
}
//爆发户来了,即在main方法中调用。
public static void main(String[] args){
Car qqCar = new QQDriver().driver();
qqCar.driver();
}
优点:这样当添加新的汽车时就不需要修改以前的代码,而是直接安装抽象工厂和抽象产品约定的合同来生成就可以被客户端调用了.符合开闭原则。
&&&& 相当于给原来的司机分配了几个属下去管理车。
缺点:当产品多时会出现非常多与之对应的实现工厂。
总结:可以将简单工厂模式与工厂方法模式结合使用。让一个子工厂管理多个产品。
&&&& 当客户不需要知道对象的创建过程,或根本不需要知道调用哪个对象。或对象存在变动的可能使用工厂方法模式。
思考:
简单工厂模式与工厂方法模式真正的避免了代码的改动了?没有。在简单工厂模式中,
新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判断逻辑留在抽
象工厂角色中,要么在客户程序中将具体工厂角色写死(就象上面的例子一样)。而且产品
对象创建条件的改变必然会引起工厂角色的修改。
面对这种情况,Java 的反射机制与配置文件的巧妙结合突破了限制——这在Spring 中
完美的体现了出来。
3.抽象工厂模式
产品家族:位于不同产品等级结构中,功能相关联的产品组成的家族。
QQ车:qq商务车、qq运动车
BaoMa车:BaoMa商务车、BaoMa运动车
则qq运动车和BaoMa运动车就算是运动车家族。
组成:
a.抽象工厂
b.具体工厂
c.抽象产品
d.具体产品
实例
//抽象工厂
public Interface AbstractFactory{
public ProductA productA();
public ProductB productB();
}
//抽象工厂子类生产2代家族
public class Product2Factory implements AbstractFactory{
public ProductA productA(){
&&& return new ProductA2();
public ProductB productB(){
&&& return new ProductB2();
}
}
//抽象工厂子类生产1代家族
public class Product1Factory implements AbstractFactory{
public ProductA productA(){
&&& return new ProductA1();
public ProductB productB(){
&&& return new ProductB1();
调用处
public static void main(String[] args){
ProductA productA1 = Product1Factory.productA();
//执行productA1的方法
}
//使用工厂类是为了提高解耦,防止出现骨牌效应
二、单例模式
1.饿汉式单利模式
public class SingleTone{
private SingleTone instance = new SingleTone();//单例实例
private SingleTone(){} //防止外部直接创建对象
//获取单利的入口
public static& SingleTone getInstance(){
2.懒汉式单利模式
public class SingleTone{
private SingleTone instance =//单例实例
private SingleTone(){} //防止外部直接创建对象
//获取单利的入口
public static synchronized SingleTone getInstance(){
if(instance == null){
instance = new SingleTone();
上面的这种模式效率比较低,可以采用双检索的方式。
public class Singleton{&&
&&& private static S&&& //声明静态的单例对象的变量&&&
&& private Singleton(){}&&& //私有构造方法&&&&
&&& public static Singleton getSingle(){&&& //外部通过此方法可以获取对象&&&&&
&&&& if(single == null){&&&&&&
&&&&&&& synchronized (Singleton.class) {&& //保证了同一时间只能只能有一个对象访问此同步块&&&&&&&&&
&&&&&&&&&&&& if(single == null){&&&&&&&
&&&&&&&&&&&&&&& single = new Singleton();&&&&&&&&&&&
&&&&&&& }&&&&&
&&&&&& }&&
&&&&&& //返回创建好的对象&&&&
注:如果是J2EE服务器是多servlet引擎或是分布式的环境中就要注意单例模式的使用
让单例可以串行话
public final class Singleton implements Serializable{
private Singleton () { }
private static final Singleton INSTANCE = new Singleton ();
public static Singleton getInstance() { return INSTANCE; }
private Object readResolve() throws ObjectStreamException {
return INSTANCE;
}
}
JamesZhao1987
浏览: 152851 次
来自: 北京
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'PHP设计模式之工厂模式与单例模式
当前位置: >
> PHP设计模式之工厂模式与单例模式PHP设计模式之工厂模式与单例模式更新:&&&&编辑:平卉&&&&来源:哥乖&&&&人气:加载中...&&&&字号:|标签:&&&&&&&&
本文实例讲述了PHP之与模式实现法子。给大家供大家参考,具体如下:
简单说应对某类而的方式
模式:应对需求创建相应的对象
class factory{
function __construct($name){
if(file_exists('./'.$name.'.class.php')){
return new $
die('not exist');
模式:只创建一个对象的实例,不允许再创建实例,节俭(例如数据库的连接)
class instance{
public $val = 10;
private static $
private function __construct(){}
private function __clone(){}
//设置为静态法子才可被类调用
public static function getInstance(){
/*if(!isset(self::$instance)){
self::$instance =
if(!isset(instance::$instance)){
instance::$instance =
return instance::$
$obj_one = instance::getInstance();
$obj_one-&val = 20;
//clone可以调用__clone()克隆即new出一个新的的对象
//$obj_two = clone $obj_
$obj_two = instance::getInstance();
echo $obj_two-&
echo '&p&';
var_dump($obj_one,$obj_two);
运行结果如下:
object(instance)[1]
public 'val' =& int 20
object(instance)[1]
public 'val' =& int 20
使用:数据库连接类(database access oject)
class mysqldb{
private $arr = array(
'port' =& 3306,
'host' =& 'localhost',
'username' =& 'root',
'passward' =& 'root',
'dbname' =& 'instance',
'charset' =& 'utf8'
private function __clone(){}
private function __construct(){
$this-&link = mysql_connect($this-&arr['host'],$this-&arr['username'],$this-&arr['passward']) or die(mysql_error());
mysql_select_db($this-&arr['dbname']) or die('db error');
mysql_set_charset($this-&arr['charset']);
static public function getInsance(){
if(!isset(mysqldb::$instance)){
mysqldb::$instance =
return mysqldb::$
public function query($sql){
if($res = mysql_query($sql)){
//fetch one
public function get_one($sql){
$res = $this-&query($sql);
if($result = mysql_fetch_row($res)){
return $result[0];
//fetch row
public function get_row($sql){
$res = $this-&query($sql);
if($result = mysql_fetch_assoc($res)){
//fetch all
public function get_all($sql){
$res = $this-&query($sql);
$arr = array();
while($result = mysql_fetch_assoc($res)){
$arr[] = $
$mysql = mysqldb::getInsance();
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
分类选择您可能在找这些帮设计师节省1,085,543,232小时}

我要回帖

更多关于 php mysqli单例模式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信