单例模式

设计模式---单例模式

亡梦爱人 提交于 2020-02-15 01:02:15
所谓单例,即使单一的实例,就是要保证对象只有一个。 单例模式:单一的实例,保证类在内存中的只有一个对象。 举例:windows的打印服务,网站计数器 java的应用:Runtime 2.如何保证类在内存中只有一个对象? A:把构造器方法私有,为了不让外界创建对象 B:在类中去创建一个对象 C:通过一个公共的访问方式给外界提供一个入口 单例模式,分饿汉式或懒汉式。 下面请看饿汉式 package cn.itcast_singleton; public class Student { //为了不让外界访问,我们把构造器方法私有 private Student(){}; //创建一个对象 //为了满足静态方法访问,这里必须加一个静态修饰符 //为了不让外界修改s对象,加私有修饰 private static Student s=new Student(); //提供一个公共的访问方式 //为了让外界直接访问,我们就给方法添加一个静态修饰符 public static Student getStudent(){ return s; } public void show(){ System.out.println("i love java"); } } package cn.itcast_singleton; public class StudentTest { public static

单例模式

本小妞迷上赌 提交于 2020-02-14 19:56:37
只生成一个实例的模式,我们称之为 单例模式。 原文地址: 单例模式 - 只有一个实例 博客地址: http://blog.720ui.com/ 程序在运行的时候,通常会有很多的实例。例如,我们创建 100 个字符串的时候,会生成 100 个 String 类的实例。 但是,有的时候,我们只想要类的实例只存在一个。例如,「你猜我画」中的画板,在一个房间中的用户需要共用一个画板实例,而不是每个用户都分配一个画板的实例。 此外,对于数据库连接、线程池、配置文件解析加载等一些非常耗时,占用系统资源的操作,并且还存在频繁创建和销毁对象,如果每次都创建一个实例,这个系统开销是非常恐怖的,所以,我们可以始终使用一个公共的实例,以节约系统开销。 像这样确保只生成一个实例的模式,我们称之为 单例模式。 如何理解单例模式 单例模式的目的在于,一个类只有一个实例存在,即保证一个类在内存中的对象唯一性。 现在,我们来理解这个类图。 静态类成员变量 Singleton 类定义的静态的 instance 成员变量,并将其初始化为 Singleton 类的实例。这样,就可以保证单例类只有一个实例。 私有的构造方法 Singleton 类的构造方法是私有的,这个设计的目的在于,防止类外部调用该构造方法。单例模式必须要确保在任何情况下,都只能生成一个实例。为了达到这个目的,必须设置构造方法为私有的。换句话说

单例模式

冷暖自知 提交于 2020-02-14 03:37:08
一个jvm中,只能有一个实例,保证对象唯一 应用场景: windows的任务管理器就是呀,小伙伴们不信可以点击下试试,看看能创建几次 servlet 连接池 线程池 spring(默认单例)枚举 常量 为啥设置单例? 优点? 保证对象的唯一性 节约内存 方便管理 重复利用 缺点? 线程安全问题 单例模式 什么是单例 保证一个类只有一个实例,并且提供一个访问该全局访问点 单例应用场景 1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~ 2. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。 3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。 4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。 5. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。 6. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的

【设计模式1】-单例模式

雨燕双飞 提交于 2020-02-13 23:41:06
三个特点 单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点; 实现模式1,懒汉模式。需要加关键字volatile 和 synchronized才能实现线程安全,加了之后有性能开销。 public class LazySingleton { private static volatile LazySingleton instance=null; //保证 instance 在所有线程中同步 private LazySingleton(){} //private 避免类在外部被实例化 public static synchronized LazySingleton getInstance() { //getInstance 方法前加同步 if(instance==null) { instance=new LazySingleton(); } return instance; } } 实现模式2,饿汉模式。实例在类加载时就创建,线程安全。 public class HungrySingleton { private static final HungrySingleton instance=new HungrySingleton(); private HungrySingleton(){} public static

单例模式概念

痴心易碎 提交于 2020-02-12 05:00:48
单例模式概念 单例模式是指整个应用中类只有一个对象实例的设计模式。 单例模式的特点 单例模式的特点 单例模式的主要特点是“ 三私一公 ”: 需要一个保存类的唯一实例的 私有静态成员变量 构造函数 必须声明为私有的,防止外部程序new一个对象从而失去单例的意义 克隆函数 必须声明为私有的,防止对象被克隆 必须提供一个访问这个实例的 公共静态方法 (通常命名为getInstance),从而返回唯一实例的一个引用。 一个类在整个应用中只有一个实例 类必须自行创建这个实例 必须自行向整个系统提供这个实例 php中使用单例模式的原因 我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会 存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都 是对数据库的一种极大考验和浪费。 贴出我之前常用的不好的数据库连接代码,给大家一个错误示范: <?php class MysqlConn { // MYSQL数据库连接信息 const MYSQLHOSTNAME = "127.0.0.1"; const MYSQLUSERNAME = "root"; const MYSQLPASSWORD = "***"; const

php设计模式——单例模式

China☆狼群 提交于 2020-02-12 04:47:59
单例模式概念 单例模式是指整个应用中类只有一个对象实例的设计模式。 单例模式的特点 一个类在整个应用中只有一个实例 类必须自行创建这个实例 必须自行向整个系统提供这个实例 php中使用单例模式的原因 我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都是对数据库的一种极大考验和浪费。 贴出我之前常用的不好的数据库连接代码,给大家一个错误示范: <?php class MysqlConn { // MYSQL数据库连接信息 const MYSQLHOSTNAME = "127.0.0.1"; const MYSQLUSERNAME = "root"; const MYSQLPASSWORD = "***"; const MYSQLDBNAME = "test"; const MYSQLCHARSET = "utf8"; /** * Description:mysql数据库连接函数 * Return value:连接成功返回数据库连接句柄;连接失败返回错误消息 */ public function MysqlConnect() { $db = new mysqli

php设计模式——单例模式

本秂侑毒 提交于 2020-02-12 04:23:57
转载自php设计模式——单例模式 单例模式概念 单例模式是指整个应用中类只有一个对象实例的设计模式。 单例模式的特点 一个类在整个应用中只有一个实例 类必须自行创建这个实例 必须自行向整个系统提供这个实例 php中使用单例模式的原因 我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会 存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都 是对数据库的一种极大考验和浪费。 贴出我之前常用的不好的数据库连接代码,给大家一个错误示范: <?php class MysqlConn { // MYSQL数据库连接信息 const MYSQLHOSTNAME = "127.0.0.1" ; const MYSQLUSERNAME = "root" ; const MYSQLPASSWORD = "***" ; const MYSQLDBNAME = "test" ; const MYSQLCHARSET = "utf8" ; /** * Description:mysql数据库连接函数 * Return value:连接成功返回数据库连接句柄;连接失败返回错误消息 */ public function

PHP用单例模式实现一个数据库类

ぃ、小莉子 提交于 2020-02-12 03:08:32
使用单例模式的出发点:     1、php 的应用主要在于数据库应用 , 所以一个应用中会存在大量的数据库操作 , 使用单例模式 , 则可以避免大量的 new 操作消耗的资源。   2、如果系统中需要有一个类来全局控制某些配置信息 , 那么使用单例模式可以很方便的实现 . 这个可以参看 ZF的 FrontController 部分。   3、在一次页面请求中 , 便于进行调试 , 因为所有的代码 ( 例如数据库操作类 db) 都集中在一个类中 , 我们可以在类中设置钩子 , 输出日志,从而避免到处 var_dump, echo 。 创造单例注意:   1、一个雷只能有一个类对象(只能实例化一个对象)   2、它必须自己创建这个实例   3、它必须自行向整个系统提供这个实例   4、构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去单例模式的意义   5、 getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用   6 、拥有一个保存类的实例的静态成员变量   7、PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收   8 、拥有一个访问这个实例的公共的静态方法(常用 getInstance() 方法进行实例化单例类,通过 instanceof

php单例设计模式

白昼怎懂夜的黑 提交于 2020-02-12 01:18:49
//单例模式 /** 2 * 设计模式之单例模式 3 * $_instance必须声明为静态的私有变量 4 * 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义 5 * getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用 6 * ::操作符只能访问静态变量和静态函数 7 * new对象都会消耗内存 8 * 使用场景:最常用的地方是数据库连接。 9 * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。 10 */ class man { //保存例实例在此属性中 private static $_instance; //构造函数声明为private,防止直接创建对象 private function __construct() { echo '我被实例化了!'; } //单例方法 public static function get_instance() { var_dump(isset(self::$_instance)); if(!isset(self::$_instance)) { self::$_instance=new self(); } return self::$_instance; } //阻止用户复制对象实例 private function __clone() { trigger_error(

单例模式

∥☆過路亽.° 提交于 2020-02-12 00:33:39
/** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义 * getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用 * ::操作符只能访问静态变量和静态函数 * new对象都会消耗内存 * 使用场景:最常用的地方是数据库连接。 * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。 */ class man { //保存例实例在此属性中 private static $_instance; //构造函数声明为private,防止直接创建对象 private function __construct() { echo '我被实例化了!'; } //单例方法 public static function get_instance() { var_dump(isset(self::$_instance)); if(!isset(self::$_instance)) { self::$_instance=new self(); } return self::$_instance; } //阻止用户复制对象实例 private function __clone() { trigger_error('Clone is not allow' ,E_USER