第25 章 : 单例设计模式
110 单例设计
单例设计模式:只允许提供一个实例对象
- 饿汉式:系统加载就实例化
- 懒汉式:第一次使用的时候实例化
多例设计模式
单例模式特点:
构造方法私有化,内部提供static方法获取实例化对象
饿汉式单例模式
class Singleton{ private static Singleton singleton = new Singleton(); // 构造函数私有化 private Singleton(){}; public static Singleton getInstance(){ return singleton ; } } class Demo{ public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); } }
懒汉式单例模式
class Singleton{ private static Singleton singleton ; // 构造函数私有化 private Singleton(){}; public static Singleton getInstance(){ // 第一次使用实例化 if (singleton == null){ singleton = new Singleton(); } return singleton ; } }
111 多例设计
class Color{ private String title; private static final Color RED = new Color("红色"); private static final Color GREEN = new Color("绿色"); private static final Color BLUE = new Color("蓝色"); 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; } } @Override public String toString(){ return this.title; } } class Demo{ public static void main(String[] args) { Color red = Color.getInstance("red") ; System.out.println(red); } }
单例和多例都会提供一个静态获取实例化的方法
第26 章 : 枚举
112 定义枚举类
JDK >= 1.5
枚举主要用于定义有限个数对象的一种结构(多例设计)
枚举可以在程序编译时判断实例化对象是否存在
enum Color{ RED, GREEN, BLUE } class Demo{ public static void main(String[] args) { for(Color color : Color.values()){ System.out.println(color); } // RED GREEN BLUE } }
switch中对枚举类判断
enum Color{ RED, GREEN, BLUE } class Demo{ public static void main(String[] args) { Color color = Color.RED ; switch(color){ case RED : System.out.println("红色"); break; case GREEN : System.out.println("绿色"); break; case BLUE : System.out.println("蓝色"); break; default : System.out.println("default"); } // 红色 } }
113 Enum类
枚举本质是一个类
枚举中每一个对象序号都是根据枚举对象的定义顺序来决定的
enum Color{ RED, GREEN, BLUE } class Demo{ public static void main(String[] args) { for(Color color : Color.values()){ System.out.println(color.ordinal() + " - " + color.name()); } /** 0 - RED 1 - GREEN 2 - BLUE */ } }
enum和Enum区别
enum 是JDK 1.5之后提供的关键字,定义枚举类
Enum 是一个抽象类,关键字enum定义的类默认继承此类
114 定义枚举结构
枚举类本身属于多例设计模式
在枚举类中定义其他结构
// 枚举类 enum Color{ // 枚举对象要写在首行 RED("红色"), GREEN("绿色"), BLUE("蓝色") ; // 定义属性 private String title ; private Color(String title){ this.title = title ; } @Override public String toString(){ return this.title ; } } class Demo{ public static void main(String[] args) { for(Color color : Color.values()){ System.out.println(color.ordinal() + " - " + color.name() + " - " + color); } /** 0 - RED - 红色 1 - GREEN - 绿色 2 - BLUE - 蓝色 */ } }
枚举类中可以实现接口继承
interface Imessage{ public String getMessage(); } enum Color implements Imessage{ RED("红色"), GREEN("绿色"), BLUE("蓝色") ; private String title ; private Color(String title){ this.title = title ; } @Override public String toString(){ return this.title ; } public String getMessage(){ return this.title ; } } class Demo{ public static void main(String[] args) { Imessage message = Color.RED ; System.out.println(message.getMessage()); // 红色 } }
枚举类可以直接定义抽象方法,
并且要求每一个枚举对象都要独立覆写此抽象方法
enum Color{ RED("红色"){ public String getMessage(){ return this.toString(); } }, GREEN("绿色"){ public String getMessage(){ return this.toString(); } }, BLUE("蓝色"){ public String getMessage(){ return this.toString(); } } ; private String title ; private Color(String title){ this.title = title ; } @Override public String toString(){ return this.title ; } public abstract String getMessage() ; } class Demo{ public static void main(String[] args) { System.out.println(Color.RED.getMessage()); // 红色 } }
枚举类不建议写太多内容
115 枚举应用案例
enum Sex{ MAN("男"), FEMALE("女") ; private String title; private Sex(String title){ this.title = title ; } @Override public String toString(){ return this.title ; } } class Person{ private String name ; private int age ; private Sex sex ; public Person(String name, int age, Sex sex){ this.name = name ; this.age = age ; this.sex = sex ; } @Override public String toString(){ return "Person(" + this.name + " " + this.age + " " + this.sex + ")"; } } class Demo{ public static void main(String[] args) { Person person = new Person("张三", 23, Sex.MAN); System.out.println(person); // Person(张三 23 男) } }