`

PHP中单例模式和工厂模式学习总结

阅读更多
<?php
	//////////////////////////////////////////////
	//单例模式
	/**
	 *	数据库连接职责的集中控制
	 *	声明一个单例类
	*/
	class Database {
	
		private $_db;	//声明一个私有的实例变量(构造对象时这个变量的值会被填充)
		static $_instance	//声明一个静态变量(保存类中仅有的一个实例)
		
		//声明私有构造方法为了防止外部代码使用new操作符来创建对象
		private function _construct(){
			$this->_db = pg_connect('dbname = example_db');
		}
		
		//声明私有_clone方法为了消除php语言中可以复制对象从而破坏单一职责的一个漏洞
		private _clone(){};
		/**
		 *	声明getInstance()静态方法(单例模式实际构造);这个方法会检测静态实例变量是否已保存这个类的一个实例。
		 *	假如它没有包含自身的一个实例,那么类会初始化并且保存到$_instance变量中.
		 *	下次访问这段代码时,$_instance 变量会保存类的一个实例,并且这个实例不会再次初始化。最后,这个方法返回实例的引用
		*/
		public static function getInstance(){
			if( !(self::$_instance instanceof self) ){
				self::$_instance = new self();
			}
			return self::$_instance;
		}
		
		public function query($sql){
			return pg_query($this->_db, $sql);//使用$this->_db执行一个查询
		}
		
	}
	
	/**
	 *	对单例类的使用
	*/
	$db = Database::getInstance();
	$db->query('select * from example_table');
	
	/**
	 *	使用不能被实例化的纯静态类
	*/
	class SomeClass {
	
		//防止类被当作实例使用
		private function _construct(){}
		
		public static function SomeMethod(){
			//执行一些操作
		} 
		
	}
	
	///////////////////////////////////////////////////////
	//工厂模式:包含了一个专门用来创建其他对象的方法的类。
	
	/**
	 *	创建一个基本的工厂类
	*/
	class MyObject {
	
		//对象将从工厂返回
	}
	
	class MyFactory {
	
		public static function factory(){
			//返回对象一个新实例
			return new MyObject();
		}
	}
	//调用方法
	$instance = MyFactory::factory();

//////////////////////////////////////////	
	
	//图片对象工厂
	/**
	 *	使用工厂类解析图片文件
	*/
	interface IImage {
	
		function getHeight();
		function getWidth();
		function getData();
	}
	
	class Iamge_PNG implements IImage {
	
		private $_width, $_height, $_data;
		
		public function _construct($file){
			$this->_file = $_file;
			$this->_parse();
		}
		
		private function _parse(){
			//完成格式化解析工作
			//并填充$_width, $_height, $_data
		}
		
		public function getWidth(){
			return $this->$_width;
		}
		
		public function getHeight(){
			return $this->$_height;
		}
		
		public function getData(){
			return $this->$_data;
		}
		
	}
	
	class Iamge_JPEG implements IImage {
	
		private $_width, $_height, $_data;
		
		public function _construct($file){
			$this->_file = $_file;
			$this->_parse();
		}
		
		private function _parse(){
			//完成格式化解析工作
			//并填充$_width, $_height, $_data
		}
		
		public function getWidth(){
			return $this->$_width;
		}
		
		public function getHeight(){
			return $this->$_height;
		}
		
		public function getData(){
			return $this->$_data;
		}
		
	}
	
	class ImageFactory {
	
		public static function factory($file){
			$pathParts = pathInfo($file);
			switch (strtolower($pathParts['extension'])) {
				case 'jpg' :
					$ret = new Image_JPEG($file);
					break;
				case 'png' :
					$ret = new Image_PNG($file);
					break;
				case 'gif' :
					$ret = new Image_GIF($file);
					break;
				default;
					// PROBLEM
			}
			if($ret instanceof IImage){
				return $ret;
			}else{
				//problem
			}
			
		}
	
	}
	
	//
	$image = ImageFactory::factory('/path/to/my.jpg');
	//$image现在是Image_JPEG类的一个实例
	echo $image->getWidth();	
	
	/**
	 *	可移植的数据库
	 ×	使用工厂类解决数据库可移植问题。
	*/
	interface IDatabaseBindings {
		
		public function userExists($email);
		
	}
	
	class PGSQL implements IDatabaseBindings {
		
		protected $_connection;
		public function _construct() {
			$this->$_connection = pg_connect('dbname = example_db');
		}
		public function userExists($email) {
			$emailEscaped = pg_escape_string($email);
			$query = 'select 1 from users where email = "'.$emailEscaped.'"';
			if ($result = pg_query($query, $this->$_connection)) {
				return (pg_num_row($result > 0)) ? true : false;
			}else{
				return false;
			}
		}
		
	}	
	
	class MYSQL implements IDatabaseBindings() {
	
		protected $_connection;
		public function _construct() {
			$this->$connection = mysql_connect('localhost');
			mysql_select_db('example_db', $this->$_connection );
		}
		public function userExists($email) {
			$emailEscaped = mysql_real_escape_string($email);
			$query = 'select 1 from users where email = "'. $emailEscaped .'"';
			if ($result = mysql_query($query, $this->$_connection)) {
				return (mysql_num_rows($result) > 0 ) ? true : false;
			}else{
				return false;
			}
		}
	
	}
	
	class DatabaseFactory {
		
		public static function factory() {
		
			$type = loadtypefromconfigfile();
			switch ($type){
				case 'PGSQL':
					return new PGSQL();
					break;
				case 'MYSQL':
					return new MYSQL();
					break;
			}
		
		}
		
	}
	
	//用法
	
	$db = DatabaseFactory::factory();
	$db->userExists('person@example');
?>

分享到:
评论

相关推荐

    Java多线程编程环境中单例模式的实现

    ### Java多线程编程环境中单例模式的实现 #### 概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式的应用非常广泛,特别是在资源管理、日志记录、...

    基于php设计模式中单例模式的应用分析

    此外,单例模式在PHP框架如Zend Framework(ZF)中也有广泛应用,比如`FrontController`部分,它作为整个应用的入口,控制着请求的分发和处理。 然而,单例模式并非总是最佳选择,它可能带来代码的耦合度增加、测试...

    PHP中单例模式与工厂模式详解

    我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会 存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的...

    JAVA中单例模式的几种实现方式.doc

    ### JAVA中单例模式的几种实现方式 #### 1. 线程非安全的基本实现方式 单例模式是设计模式中的一种常用形式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式可以通过多种方式来...

    c++中单例模式对象的释放控制

    在C++编程领域,设计模式是解决特定问题的模板,其中单例模式(Singleton Pattern)是一种常用的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。然而,在C++中实现单例模式时,如何正确管理这个...

    Kotlin中单例模式和Java的对比浅析

    Kotlin 中单例模式和 Java 的对比浅析 Kotlin 中单例模式是指在应用程序中确保某个类仅有一个实例,并提供一个全局访问点的机制。单例模式是一种常用的设计模式,在 Java 和 Kotlin 中都有多种实现方式。下面我们将...

    java 中单例模式饿汉式与懒汉式的对比

    java 中单例模式饿汉式与懒汉式的对比 java 中单例模式是保证一个类仅有一个实例,并提供...java 中单例模式饿汉式与懒汉式的对比可以帮助我们更好地理解和应用单例模式,并在实际开发中选择合适的单例模式实现方式。

    Python中单例模式总结

    总结,Python中的单例模式有多种实现方式,可以根据实际需求选择合适的方法。无论哪种方式,其核心都是限制类的实例化次数,确保在整个程序运行期间,类只有一个实例。同时,要注意在多线程环境下,确保单例模式的...

    java单例模式实例

    单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。...通过学习和实践这些单例模式的实现,我们可以更好地理解和应用设计模式,提升代码的质量和可维护性。

    PHP中单例模式的使用场景与使用方法讲解

    单例模式的应用场景包括:线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡驱动程序等,尤其在数据库操作中,单例模式可以避免频繁的new操作,从而降低系统和内存资源的消耗。 单例模式主要有三种实现...

    浅谈Java中单例设计模式之构造方法私有化.pdf

    总的来说,单例设计模式是Java中一种非常有用的模式,通过构造方法私有化和其他技术手段,可以有效地控制对象的创建,实现对类实例的唯一性管理,防止对象的滥用,从而提高程序的性能和效率。在设计具体的应用程序时...

    单例模式实现mdi界面子窗体控制

    首先向关注过我这个系列...这立刻让我想到了最常用也是最简单最容易理解的一个设计模式 单例模式 何为 单例模式 ? 故名思议 即 让 类 永远都只能有一个实例。 由于 示例代码 比较简单 我也加了注释,这里就不在赘述

    Java中单例模式详解

    在Java中,实现单例模式主要有三种方式:懒汉式、饿汉式和登记式。 **懒汉式单例**: 懒汉式单例的特点是在类第一次被使用时才创建实例,延迟加载,以节省资源。然而,非线程安全的懒汉式单例在多线程环境下可能...

    android SQLite DBHelper 单例模式 实现

    android SQLite DBHelper 单例模式 实现 dbhelper=DBHelper.getInstance(this);

Global site tag (gtag.js) - Google Analytics