Java的单例设计模式和枚举

本文探讨了Java中的单例设计模式,包括饿汉式和懒汉式的实现,强调了构造方法的私有化和通过静态方法获取唯一实例的特点。同时,文章也介绍了枚举的使用,指出枚举在JDK1.5后被引入,用于定义有限数量的对象,其实质是继承自Enum类的结构,并可以包含属性和方法,甚至实现接口。
摘要由CSDN通过智能技术生成

单例设计模式

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

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())

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值