减少系统资源开销,由于单例只保留一个对象。
提高创建速度,每次都获取已经存在的对象因此提高创建速度
全局共享对象,由于单例在系统中只存在一个对象实例,因此任何地方使用此对象都是一个对象
避免多实例创建使用时产生的逻辑错误。
使用案例:
线程池、缓存、日志对象、打印机、显卡的驱动程序
希望能帮到你!
问题一:什么是单例设计模式 java模式之单例模式:
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例
2,自己创建这个实例
3,整个系统都要使用这个实例
例: 在下面的对象图中,有一个单例对象,而客户甲、客户乙 和客户丙是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多 *** 作中,比如建立目录 数据库连接都需要这样的单线程 *** 作。一些资源管理器常常设计成单例模式。
外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中管理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来管理这些属性文件。
一个例子:Windows 回收站。
在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。
两种形式:
1,饿汉式单例类
public class Singleton {
private Singleton(){}
在自己内部定义自己一个实例,是不是很奇怪?
注意这是private 只供内部调用
private static Singleton instance = new Singleton();
这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
2,懒汉式单例类
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。>>
问题二:将一个类设计成单例设计模式,需要哪些步骤 单例模式(Singleton Pattern)是一个比较简单的模式。
定义:
确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。
通用类图:
通用代码:
Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的。
/
线程安全的单例模式
饿汉式单例
@author Administrator
/
public class Singleton {
private static final Singleton singleton = new Singleton();
限制产生多个对象
private Singleton() {
}
通过该方法获得实例对象
public static Singleton getSingleton() {
return singleton;
}
类中其他方法尽量是static
public static void doSomething() {
}
}
单例模式的优点:
由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显了。
由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决。
单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写 *** 作。
单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
单例模式的缺点:
单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能用mock的方式虚拟一个对象。
单例模式与单一职责原则有冲突。一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,单例模式把“要单例”和业务逻辑融合在一个类中。
单例模式的使用场景:
要求生成唯一序列号的环境;
在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;
创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源;
需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为static的方式)。
单例模式的注意事项:
1 在高并 况下,请注意单例模式的线程同步问题。
/
懒汉式单例
@author Administrator
/
public class Singleton2 {
private static Singleton2 singleton = null;
限制产生多个对象
private Singleton2() {
}
>>
问题三:什么是单例模式 java模式之单例模式:
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例
2,自己创建这个实例
3,整个系统都要使用这个实例
例: 在下面的对象图中,有一个单例对象,而客户甲、客户乙 和客户丙是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多 *** 作中,比如建立目录 数据库连接都需要这样的单线程 *** 作。一些资源管理器常常设计成单例模式。
外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中管理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来管理这些属性文件。
一个例子:Windows 回收站。
在整个视窗系统中,回哗站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。
两种形式:
1,饿汉式单例类
public class Singleton {
private Singleton(){}
在自己内部定义自己一个实例,是不是很奇怪?
注意这是private 只供内部调用
private static Singleton instance = new Singleton();
这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
2,懒汉式单例类
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。>>
问题四:请问,Java中,单例设计模式是个什么意思,优势何在。 单例模式:保证一个类在使用过程中,只有一个实例。优势就是他的作用,这个类永远只有一个实例。
步骤: 1 将该类的构造方式私有;
2 在内部实例化一个该类的实例;
3 提供接口给外部访问。
public class SingletonDemo {
private SingletonDemo (){}; 1
private static SingletonDemo mInstance = new SingletonDemo(); 2
public static SingletonDemo getInstance(){ 3
return mInstance;
}
}
问题五:将一个类做成单例是什么意思 单例模式(Singleton Pattern)是一个比较简单的模式。 定义: 确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。
问题六:单例模式的好处和缺点?为什么要用单例模式?详细才给分 1 单例模式 只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等
2 单例的缺点 就是不适用于变化的对象,如果同一弗型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
用单例模式,就是在适用其优点的状态下使用。
问题七:什么是Java单例模式啊? Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
在自己内部定义自己一个实例,是不是很奇怪?
注意这是private 只供内部调用
private static Singleton instance = new Singleton();
这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些
这些都是Java中的基础知识,如果你想更加详细的了解相关知识,你可以到秒秒学的网站上找到相应的课程。
问题八:你熟悉的设计模式有哪些?写出单例模式的实现代码 一共23种设计模式!
引用《软件秘笈-设计模式那点事》书籍:
按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。
创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。
创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:
工厂方法模式(Factory Method Pattern)
抽象工厂模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
单例模式(Singleton Pattern)
结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式:
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
组合模式(posite Pattern)
装饰者模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式:
责任链模式(Chain of Responsibility Pattern)
命令模式(mand Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
策略模式(Strategy Pattern)
模板方法模式(Template Method Pattern)
访问者模式(Visitor Pattern)
单例模式实现1:
public class Singleton {
类共享实例对象
private static Singleton singleton = null;
私有构造方法
private Singleton() {
Systemoutprintln(-- this is Singleton!!!);
}
获得单例方法
public synchronized static Singleton getInstance() {
判断 共享对象是否为null ,如何为null则new一个新对象
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
单例模式实现2:
public class Singleton {
类共享实例对象 实例化
private s>>
问题九:23种设计模式中哪些最重要 总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。
最常用的是:工厂模式,单例模式,建造者模式,代理模式。
其实都了解一下比较好。
问题十:设计模式中,属于结构型模式的有哪些 设计模式主要分三个类型:创建型、结构型和行为型。
其中创建型有:
一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:
六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、Template Method,模板方法:定义一个 *** 作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、mand,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的 *** 作。
十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的 *** 作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新 *** 作。
十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
结构型有:
十七、posite,组合模式:将对象组合成树形结构以表示部分整体的关系,posite使得用户对单个对象和组合对象的使用具有一致性。
十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,faade提供了一高层接口,这个接口使得子系统更容易使用。
十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
二十二、Bridge,桥模式:将抽象部分与它的实现部分>>
单例的作用是保证在类被调用的时候只被实例化一次
并且每次调用的都是该被实例化的类
作用可以思考,一个数据库链接,在一次访问中只需要一个数据库链接,并不应该产生多个数据库链接
实现的方式是通过声明一个静态变量,用来存储唯一的实例化对象
类被调用的方式不是童工new的实例化调用,为了保证不在外部被实例化,所以需要将__construct()实例化函数设置为私有或者子类继承,通过统一的调用接口调用,在你的例子里面就是getlns
该函数中判断了静态变量是否是满足自身的接口设定,不满足则实例化自己
你的代码在return $this->data[$key];这句应该是错误的
整个getlns应该改为如下
public static function getIns(){
if(!self::$ins instanceof self ){
self::$ins = new self():
}
return self::$ins;
}
你估计是写错了函数,你可以发现你的getlns中没哟$key变量,但内部却调用了,所以你应该再检查下你写的代码
1、静态方法属于类所有,类实例化前即可使用;2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员;3、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存;4、static内部只能出现static变量和其他static方法!而且static方法中还不能使用this等关键字,因为它是属于整个类;5、静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁;6、静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。主要区别:静态方法在创建对象前就可以使用了,非静态方法必须通过new出来的对象调用。如:publicclassPer{publicstaticStringgetType(){return"人类";}publicStringgetName(){return"张三";}}上面这个类中的getType方法,在没有new对象前这就可以这样用:Stringtype=PergetType();//type="人类";而getName方法则不能这样使用,编译都不会通过getName必须这样:Perp=newPer();Stringname=pgetName();//name="张三";当然,getType方法也可能通过对象调用:Stringtype=pgetType();//type="人类";
单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称之为单例类。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。下面我们讨论下为什么要使用PHP单例模式?多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育" 而PHP每次执行完页面都是会从内存中清理掉所有的资源 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了 单单从这个方面来说, PHP的单例的确有点让各位失望 但是单例仅仅只有这个功能和应用吗 答案是否定的,我们一起来看看。1 php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库 *** 作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new *** 作消耗的资源。2 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现 这个可以参看zend Framework的FrontController部分。3 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库 *** 作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
在access里面用罗斯文数据库实例建立个或自己建一个:
1、启动ACCESS建空数据库,取名“学生管理”。
2、建一个表,如果有excel数据可直接导入或在设计视图里面建表,字段名:学号、姓名、性别、出生日期、家庭住址等。取名“学生档案”至于记录,自己输入几个人的情况。
3、建一个表取名“学生成绩”,字段名:学号、课程A、课程B、课程C、课程D、课程E。至于记录,自己输入几个人的情况。
4、建关联的查询。在查询设计视图中将“学生档案”的学号拖到“学生成绩”的学号字段上。sql语句为:SELECT学生档案学号,学生档案姓名,[学生成绩]![课程A]+[学生成绩]![课程B]AS总成绩FROM学生档案INNERJOIN学号ON学生档案学号=学生成绩学号,可以查询学生成绩。
5、sql语句为:SELECT学生档案学号,学生档案姓名,[学生成绩]![课程A],[学生成绩]![课程B]FROM学生档案where((year(now)-year(出生日期)>20INNERJOIN学号ON学生档案学号=学生成绩学号
6、建一窗体(设计视图)里面建一些说明标签,一些功能按钮:按钮的单击事件调用相应的宏事件(或用VBA代码)调用需要的查询,取名“主窗体”。一个简单的数据库就建好了。access功能很多,一句两句说不清楚,找本教材看看。
一般按照如下方法导入即可。
1、win键+R,输入cmd,打开命令提示符。
2、进入dmp文件所在目录。
3、执行imp导入语句:
imp 被导入用户名/密码@实例名 file=aaadmp log=aaalog fromuser=导出用户名
如图:
注意事项:导入的oracle版本需要与导出的oracle版本一致或高于导出的oracle版本,否则导入时会报错。
PHP的轻量消息队列php-resque使用说明
消息队列处理后台任务带来的问题
项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的 *** 作,显然会有更好的用户体验。
为了实现类似的需求,Web项目中一般的实现方法是使用消息队列(Message Queue),比如MemcacheQ,RabbitMQ等等,都是很著名的产品。
消息队列说白了就是一个最简单的先进先出队列,队列的一个成员就是一段文本。正是因为消息队列实在太简单了,当拿着消息队列时,反而有点无从下手的感觉,因为这仅仅一个发送邮件的任务,就会引申出很多问题:
消息队列只能存储字符串类型的数据,如何将一个发送邮件这样的“任务”,转换为消息队列中的一个“消息”
消息队列只负责数据的存放与进出,本身不能执行任何程序,那么我们要如何从消息队列中一个一个取出数据,再将这些数据转化回任务并执行。
我们无法预知消息队列何时会有数据产生,所以我们的任务执行程序还需要具备监控消息队列的能力,也就是一个常驻后台的守护进程。
一般的Web应用PHP都以cgi方式运行,无法常驻内存。我们知道php还有cli模式,那么守护进程是否能以php cli来实现,效率如何?
当守护进程运行时,Web应用能否与后台守护进程交互,实现开启/杀死进程的功能以及获得进程的运行状态?
Resque对后台任务的设计与角色划分
对以上这些问题,目前为止我能找到的最好答案,并不是来自php,而是来自Ruby的项目Resque,正是由于Resque清晰简单的解决了后台任务带来的一系列问题,Resque的设计也被Clone到Python、php、NodeJs等语言:比如Python下的pyres以及PHP下的php-resque等等,这里有各种语言版本的Resque实现,而在本篇日志里,我们当然要以PHP版本为例来说明如何用php-resque运行一个后台任务,可能一些细节方面会与Ruby版有出入,但是本文中以php版为准。
Resque是这样解决这些问题的:
后台任务的角色划分
其实从上面的问题已经可以看出,只靠一个消息队列是无法解决所有问题的,需要新的角色介入。在Resque中,一个后台任务被抽象为由三种角色共同完成:
Job | 任务 : 一个Job就是一个需要在后台完成的任务,比如本文举例的发送邮件,就可以抽象为一个Job。在Resque中一个Job就是一个Class。
Queue | 队列 : 也就是上文的消息队列,在Resque中,队列则是由Redis实现的。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。
Worker | 执行者 : 负责从队列中取出Job并执行,可以以守护进程的方式运行在后台。
那么基于这个划分,一个后台任务在Resque下的基本流程是这样的:
将一个后台任务编写为一个独立的Class,这个Class就是一个Job。
在需要使用后台程序的地方,系统将Job Class的名称以及所需参数放入队列。
以命令行方式开启一个Worker,并通过参数指定Worker所需要处理的队列。
Worker作为守护进程运行,并且定时检查队列。
当队列中有Job时,Worker取出Job并运行,即实例化Job Class并执行Class中的方法。
至此就可以完整的运行完一个后台任务。
在Resque中,还有一个很重要的设计:一个Worker,可以处理一个队列,也可以处理很多个队列,并且可以通过增加Worker的进程/线程数来加快队列的执行速度。
php-resque的安装
需要提前说明的是,由于涉及到进程的开辟与管理,php-resque使用了php的PCNTL函数,所以只能在Linux下运行,并且需要php编译PCNTL函数。如果希望用Windows做同样的工作,那么可以去找找Resque的其他语言版本,php在Windows下非常不适合做后台任务。
以Ubuntu1204LTS为例,Ubuntu用apt安装的php已经默认编译了PCNTL函数,无需任何配置,以下指令均为root帐号安装Redis
apt-get install redis-server
安装Composer
apt-get install curl
cd /usr/local/bin
curl -s >
以上就是关于数据库链接为什么要用单例模式全部的内容,包括:数据库链接为什么要用单例模式、什么是单例设计模式、php 单例模式 不明白$ins 是什么意思 没理解了在单例中是怎么发生的作用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)