Java设计模式-深入了解
一、单例模式
应用场景:该模式最常见的用法就是统计用户访问人数(因此当系统中只需要一个实例对象或者系统中只允许一个公共访问点,除了这个公共访问点外,不能通过其他访问点访问该实例时,可以使用单例模式)。
实现方式原理:某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。
单例模式的优点:单例模式的主要优点就是节约系统资源、提高了系统效率,同时也能够严格控制客户对它的访问。
实现代码:
1.饿汉式写法
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
2.懒汉式写法(线程安全)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3.枚举实现单例模式
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
4.静态工厂实现法(重点推荐用法)
public class Singleton{
//initailzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){
}
public static Singleton getSingleton(){
return INSTANCE;
}
}
5.双重校验锁
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
思考:对于负载均衡是否能够通过单例模式实现对用户人数的统计?
二、观察者模式
应用场景: 观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。
实现方式原理:类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现。
观察者模式的优点:
1、针对观察者与被观察者分别定义接口,有利于分别进行扩展。
2、重点就在被观察者的实现中:
(1)定义观察者集合,并定义针对集合的添加、删除操作,用于增加、删除订阅者(观察者)
(2)定义通知方法,用于将新情况通知给观察者用户(订阅者用户)
3、观察者中需要有个接收被观察者通知的方法。
实现代码:
public interface Person {
//小王和小李通过这个接口可以接收到小美发过来的消息
void getMessage(String s);
}
public class LaoWang implements Person {
private String name = "小王";
public LaoWang() {
}
@Override
public void getMessage(String s) {
System.out.println(name + "接到了小美打过来的电话,电话内容是:" + s);
}
}
public class LaoLi implements Person {
private String name = "小李";
public LaoLi() {
}
@Override
public void getMessage(String s) {
System.out.println(name + "接到了小美打过来的电话,电话内容是:->" + s);
}
}
public class XiaoMei {
List<Person> list = new ArrayList<Person>();
public XiaoMei(){
}
public void addPerson(Person person){
list.add(person);
}
//遍历list,把自己的通知发送给所有暗恋自己的人
public void notifyPerson() {
for(Person person:list){
person.getMessage("你们过来吧,谁先过来谁就能陪我一起玩儿游戏!");
}
}
}
public class Test {
public static void main(String[] args) {
XiaoMei xiao_mei = new XiaoMei();
LaoWang lao_wang = new LaoWang();
LaoLi lao_li = new LaoLi();
//小王和小李在小美那里都注册了一下
xiao_mei.addPerson(lao_wang);
xiao_mei.addPerson(lao_li);
//小美向小王和小李发送通知
xiao_mei.notifyPerson();
}
}