Java设计模式:单例,工厂,观察者

设计模式

  1. 单例模式

要点:私有化构造方法;

即时加载:使用静态变量new对象,并且提供方法获取对象

//不存在多线程问题
public class Singleton{
    //静态变量
    private static Singleton simgleton = new Singleton();
    //私有化
    private Singleton(){};
    //获取实例
    public Singleton getIntences(){
        return simgleton;
    }
}

懒加载:

//存在多线程问题
public class Singleton{
    //静态变量
    private static Singleton simgleton = null;
    //私有化
    private Singleton(){};
    //获取实例
    public Singleton getIntences(){
        if(simgleton == null){
            simgleton = new Singleton();
        }
        return simgleton;
    }
}
/*
该方法只能再单线程状态时使用,多线程时会出现问题:
有A,B 两个线程
1.A执行到if,判断为null并进入if
2.B执行到if,假如实例化需要时间,此时simgleton仍为null,则B也进入if
3.A和B都各自执行了new
*/
//解决多线程问题
public class Singleton{
    //静态变量
    private static Singleton simgleton = null;
    //私有化
    private Singleton(){};
    
    private static class GetSingleton{
        private static Singleton simgleton = new Simgleton();
    }
    //获取实例
    public Singleton getIntences(){
    	return GetSingleton.simgleton;
    }
    //JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。
}
  1. 工厂模式

使得创建对象和使用对象分离

静态工厂方法更简单

  1. 观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

一个被观察者多个观察者

//模拟一个消息系订阅发布系统
//消息管理器接口
public interface MessageManageInte{
    //添加订阅者
    public void addPublisher(Publisher publisher);
    //移除订阅者
    public void removePublisher();
    //通知订阅者
    public void notifyPublish();
}
//订阅者接口
public interface publisher{
    //定义一个方法来接收消息
    public void updateMessage();
}

public class MessageManage implements MessageManageInte{
    
    private ArrayList<Publisher> list = new ArrayList<>();
    
    public void addPublisher(Publisher publisher){
        list.add(publisher);
    }
    public void removePublisher(Publisher publisher){
        list.remove(publisher);
    }
    public void notifyPublish(){
        for(Publisher p:list){
            p.updateMessage();
        }
    }
    public void publish(){
        //发布消息等相关操作 
        
        //通知订阅者
        notifyPublish();
    }
}

//
public class publisherImpl implements publisher{
    
    public void updateMessage(){
        sout("获取消息!");
    }
}
public class client{
    //main方法
    psvm{
        MessageManage messageManage = new MessageManage();
        publisherImpl publisherImpl = new publisherImpl();
        //注册订阅者
        messageManage.addPublisher(publisherImpl);
        //发布消息
        messageManage.publish();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值