Java的单例设计模式和枚举

单例设计模式

单例和多例设计模式主要是控制实例化对象个数的设计操作。
单例设计模式就是要求类只允许提供一个实例化对象,首先实例化对象的产生必然绕不过构造方法,构造方法有默认的,所以如果当实例化时用不了这个构造方法,那么这个实例化对象就产生不了

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中的方法:

扫描二维码关注公众号,回复: 12160568 查看本文章
方法名称 类型 说明
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())

	}
}

猜你喜欢

转载自blog.csdn.net/qq_43337254/article/details/107935991