单例模式

php设计模式-单例模式

匿名 (未验证) 提交于 2019-12-02 22:11:45
单例模式 定义:简单的说, 整个应用中只有一个实例对象的设计模式 。 1、单例模式的要点: 构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化; 拥有一个保存类的实例的静态成员变量 拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化) 简单的记为三私一公一关键: 私有静态属性 ( privite static $instance ),又来储存生成的唯一对象 私有构造函数 ( privite __contruct() ) 私有克隆函数 ( privite function __clone() ),防止克隆――clone 公共静态方法 ( public static function getInstance() ),用来访问静态属性储存的对象,如果没有对象,则生成此单例 关键词instanceof ,检查此变量是否为该类的对象、子类、或是实现接口。 2、为什么要使用PHP单例模式? php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现。 在一次页面请求中

js之单例模式

匿名 (未验证) 提交于 2019-12-02 21:53:52
单例模式是指一个类,只有一个实例。实现的思路是,创建实例时候加判断,如果有实例则返回,如果没有就new一个,并返回。 第一步: 创建类。 function Waiter(id, name, salary) { // 创建了一个Waiter类 Employees.call(this, id, name, salary) // 这里Waiter继承了Employees,Employees是个父类,也可以没有} Waiter.prototype = Object.create(Employees.prototype); Waiter.prototype.constructor= Waiter; Waiter.prototype.work = function (arg) { // 重写原型上的方法 if (arg instanceof Array){ //数组的话,记录点菜 console.log('finish order dish $记录work'); return this; } else { //上菜行为 console.log('finish serving a dish $记录work') } }; // cook调用的方法,返回菜单 Waiter.prototype.tellCookTheMenu = function () { return this.menu; }; /

java设计模式一单例模式

匿名 (未验证) 提交于 2019-12-02 21:53:52
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。如: 1. 需要频繁实例化然后销毁的对象。 2. 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 3. 有状态的工具类对象。 4. 频繁访问数据库或文件的对象。 应用场景举例: 1. 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。 2. 网站的计数器,一般也是采用单例模式实现,否则难以同步。 3. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。 4. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 public class EagerSingleton { private static EagerSingleton instance = new EagerSingleton(); /** * 私有默认构造子 */ private EagerSingleton (){} /** * 静态工厂方法 */ public

单例模式实现方法之懒汉式、饿汉式

匿名 (未验证) 提交于 2019-12-02 21:53:32
Singleton 单例模式是一种经常在项目开发中使用的程序设计模式,它用于创建一个全局共享的实例对象。该实例对象在整个应用程序中只有一个,不会出现更多的该实例对象。 实现原理就是将类的构造方法私有化,即使用private修饰符来修饰构造方法,这样外部就不能使用构造方法创建对象了,本类内部还是能够创建对象的,所以,可以创建一个本类类型的成员变量来保存本类的唯一对象,然后提供属性访问器方法获取这个唯一的实例,但是每次获取的都是同一个对象,而不是重新创建的。 һ. 懒汉式:当程序第一次访问单例模式实例时才进行创建 。 public class Lazy { public static Lazy instance = null; //本类的唯一实例 private Lazy() { //构造方法私有化 } if(instance==null) instance = new Lazy(); return instance; } } 二. 饿汉式:在程序启动或单例模式类被加载的时候,单例模式实例就已经被创建。 public class Hungry { private static Hungry instance = new Hungry();//本类的唯一实例 private Hungry() { //构造方法私有化 } public static Hungry getInstance()

Java设计模式之:单例模式

匿名 (未验证) 提交于 2019-12-02 21:53:32
建议实现方式: 枚举方式实现单例 单例模式就是在程序运行中只实例化一次,创建一个全局唯一对象,有点像 Java 的静态变量,但是单例模式要优于静态变量,静态变量在程序启动的时候JVM就会进行加载,如果不使用,会造成大量的资源浪费,单例模式能够实现懒加载,能够在使用实例的时候才去创建实例。开发工具类库中的很多工具类都应用了单例模式,比例线程池、缓存、日志对象等,它们都只需要创建一个对象,如果创建多份实例,可能会带来不可预知的问题,比如资源的浪费、结果处理不一致等问题。 懒汉模式,线程不安全 懒汉模式,线程安全 饿汉模式 饿汉模式变种 静态内部类模式 枚举类模式 双重检查锁模式 类在加载的时候,就会加载类里面的静态变量(即为静态变量分配内存空间),这样在类被实例化时,就可以直接使用,加快速度。 类在每次实例化时,调用对应的构造方法,完成类成员变量里的非静态变量的初始化,分配相应的内存空间 为什么用枚举类来实现单例模式越来越流行? 参考: https://mp.weixin.qq.com/s/aGMz1u0Oh4ZHTDBFvgq0lg 来源:博客园 作者: 脚本小娃子 链接:https://www.cnblogs.com/shengulong/p/11809611.html

Java:单例模式探究

匿名 (未验证) 提交于 2019-12-02 21:52:03
Java:单例模式探究   单例模式可以说只要是一个合格的开发都会写,但是如果要深究,小小的单例模式可以牵扯到很多东西,比如 多线程是否安全,是否懒加载,性能等等。还有你知道几种单例模式的写法呢?如何防止反射破坏单例模式?今天,我们来探究单例模式。 关于单例模式的概念,在这里就不在阐述了,相信每个小伙伴都了如指掌。我们直接进入正题: 饿汉式 public class Hungry { private Hungry() { } private final static Hungry hungry = new Hungry(); public static Hungry getInstance() { return hungry; } } 饿汉式是最简单的单例模式的写法,保证了线程的安全,在很长的时间里,我都是饿汉模式来完成单例的,因为够简单,后来才知道饿汉式会有一点小问题,看下面的代码: public class Hungry { private byte[] data1 = new byte[1024]; private byte[] data2 = new byte[1024]; private byte[] data3 = new byte[1024]; private byte[] data4 = new byte[1024]; private Hungry() { }

Java中的单例模式

匿名 (未验证) 提交于 2019-12-02 21:45:52
public class HungerySingleton { //ClassLoader 类加载时立即实例化对象,仅实例化一次,线程安全的 private static HungerySingleton hungerySingleton = new HungerySingleton(); public static HungerySingleton getInstance(){ return hungerySingleton; } //利用线程输出(后面就不写了哈) public static void main(String[]args){ for(int i=0;i<20;i++){ Thread thread =new Thread() { @Override public void run() { HungerySingleton hungerySingleton = HungerySingleton.getInstance(); System.out.println(hungerySingleton); } }; thread.start(); } } } 优点:仅实例化一次,线程是安全的。获取实例的速度快 缺点:类加载时立即实例化对象,可能实例化的对象不被使用,造成内存的浪费。 二、懒汉式 public class HoonSingleton { /

用JavaScript来实现单例模式

最后都变了- 提交于 2019-12-02 20:09:16
首先,了解一下什么是单例模式,这里我直接把菜鸟教程中的定义给copy过来: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 用一句话来总结就是:在单例模式中,一个类仅有一个实例,并提供一个访问它的全局访问点。这无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象,在JavaScript我们很自然而然就会想到用 闭包 来解决这个问题。 比如说需要生成一个页面登录框,因为有且只可能有一个登录框,那么你就可以用单例的思想去实现他,代码如下: 1 let createLoginWindow = function(title) { 2 this.title= title; 3 this.init(); 4 } 5 6 createLoginWindow.prototype.init = function() { 7 // some code 8 9 }

23种设计模式之单例模式singleton

走远了吗. 提交于 2019-12-02 18:55:17
1、创建单例模式的原因 节省系统资源、保持数据的一致性。 例子:windows中只能打开一个任务管理器、线程池、数据库连接池、网站计数器等,都被设计成单例模式。 2、单例模式的特点 (1)只有一个实例对象; (2)由单例类自行创建; (3)对外提供一个访问该单例的全局访问点。(常用static方法) 3、如何构建单例模式 (1)懒汉式 package cn.function.designmodel; public class SingletonTest { // 静态变量,原子操作 private static volatile SingletonTest singletonTest = null; // 用于外部测试是否是单例 public String name = "我是单例1"; // 通过构造私有的构造方法,防止被外部实例化 private SingletonTest() { }; // 对外提供一个实例化的方法,生成单例 public static SingletonTest getInstance() { if (singletonTest == null) { singletonTest = new SingletonTest(); } return singletonTest; } } (2)饿汉式 一旦加载类,就创建一个单例 package cn

单例模式

倾然丶 夕夏残阳落幕 提交于 2019-12-02 18:01:58
使用 private关键字将默认构造函数定义私有防止创建实例。 使得对象在内存中只存在一个 可参考代码。 public class SimpLeMath { private SimpLeMath() { } private static SimpLeMath simple { get; set; } public static SimpLeMath GetSimpLeMath(){ if(simple==null){ simple=new SimpLeMath(); return simple; }else{ return simple; } } } 按照以上代码 构造函数私有时,实例不可以创建只有调用自身的GetSimpleMath()方法。 来源: https://www.cnblogs.com/cdjbolg/p/11756674.html