单例设计模式
单例和多例设计模式主要是控制实例化对象个数的设计操作。
单例设计模式就是要求类只允许提供一个实例化对象,首先实例化对象的产生必然绕不过构造方法,构造方法有默认的,所以如果当实例化时用不了这个构造方法,那么这个实例化对象就产生不了
class Singleton {
private static final Singleton INSTANCE = new Singleton() ;
/* 第二步:
1、由于第一步将构造方法封装,所以要调用构造方法只能在本类调用,所以就加了一个instance属性来调用构造方法;
2、但此时instance属性只是普通属性,无法在实例化对象之前访问,所以,在该属性前要添加static保证可以在实例化之前访问
3、但同时instance作为内部属性也需要被封装,所以在属性前追加private来进行封装
4、在属性封装后就需要一个static方法(getInstance())来获得此属性
5、然后现在虽然提供有static的实例化对象,但这个对象依然可以被重新实例化,为了保证此时Singleton类内部的instance无法再次实例化,就需要在instance属性前追加final定义,然后就实现了单例设计模式
*/
private Singleton() { } // 第一步:将构造方法私有化,但此时就无法在外部调用构造方法,所以也就不会产生实例化对象,所以还需要继续改进
public static Singleton getInstance () {//添加一个static方法来获取instance属性
return INSTANCE ;
}
public void print() {
System.out.println("www.baidu.com") ;
}
}
public class JavaDemo {
public static void main(String args[]) {
Singleton instance = null ; //声明对象
instance = Singleton.getInstance() ;
instance.print() ;
}
}
对于单例设计也分为两种模式:饿汉式和懒汉式
- 饿汉式:在系统加载类的时候就会自动提供有Singleton类的实例化对象(上例属于饿汉式)
- 懒汉式:在第一次使用的时候进行实例化对象处理(首先将上例的instance属性去掉final并不产生对象,然后在getInstance方法中加入一句“if(insatnce == null){instance = new Singleton();}”)
面试题:请编写一个Singleton程序,并说明其主要特点?
- 代码程序如上(可以把懒汉式(后面需要考虑到线程同步问题)和饿汉式都写上)
- 特点:构造方法私有化,类内部提供static 方法获取实例化对象,这样不管外部如何操作永远都只有一个实例化对象提供
多例设计模式
和单例的本质相似,保留有多个实例化对象的类
比如三基色的类:
class Color {//定义描述颜色的类
private static final Color RED = new Color ("红色") ;
private static final Color GREEN = new Color ("绿色") ;
private static final Color BLUE = new Color("蓝色") ;
private String title ;
private Color(String title) { // 构造方法私有化
this. title = title ;
}
public static Color getInstance(String color) {
switch (color) {
case " red" :return RED ;
case "green": return GREEN ;
case "blue": return BLUE;
default: return null ;
}
}
public String toString() {
return this. title ;
}
}
public class JavaDemo {
public static void main (String args[]) {
Color c= Color.getInstance("green");
System. out.println(c);
}
}
枚举
JDK1.5之后提出的,主要用于定义有限个数对象的一种结构,枚举就属于多例设计,枚举比多例简单
定义枚举类
在程序中有enum关键字来定义,以上面多例设计为例改造:
enum Color{ // 枚举类.
RED,GREEN,BLUE ;//实例化对象.
}
public class JavaDemo {
public static void main(String args[]) {
for(Color c : Color.values()){//提供有values方法来获得所有实例化对象
System. out,println(c)
switch(c) { //switch直接支持枚举
case RED : System.out.println("红色") ; break ;
case GREEN :System.out.println("绿色") ;break ;
case BLUE : System.out.println("蓝色") ;break ;
}
}
}
}
Enum类
枚举实际上是一个集成Enum类的结构,Enum类的基本定义为:
public abstract class Enum<E extends Enum< E >>.
extends Object.
implements Comparable< E >, Serializable.
定义的枚举类的类型就是Enum中所使用的E类型,Enum中的方法:
方法名称 | 类型 | 说明 |
---|---|---|
protected Enum( String name, int ordinal) | 构造 | 传入名字和序号 |
public final String name() | 普通 | 获得对象名称 |
public final int ordinal() | 普通 | 获得对象序号 |
定义枚举结构
枚举结构中可以有属性,方法也实现一个接口,以及枚举里面可以写抽象类,并且在实例化里面覆写所有的抽象方法
interface IMessage {
public String getMessage() ;
}
enum Color implements IMseeage{ // 枚举类
RED("红色") ,GREEN("绿色") , BLUE("蓝色") ; // 枚举对象要写在首行
private String title ; //定义属性
private Color(String title) {
this. title = title ;
}
public String toString() {
return this. title ;
}
public String getMessage() {
return this. title ;
}
}
public class JavaDemo {
public static void main (String args[]) {
for (Color c : Color. values ()) {
System.out.println(c.ordinal()+”-”+c.name()+"-"+c);
}
IMessage msg = Color. RED;
System. out. println(msg. getMessage())
}
}