设计模式分为三类:
创建类型模式:单例、工厂、建造者...
结构型设计模式:适配器、代理、桥接...
行为型设计模式:策略、观察者、迭代器...
一.单例模式
保证一个类只有一个实例,并提供一个全局访问点 使用场景:项目中共享的数据 消耗资源多的对象 工具类对象
特点:构造方法为私有、提供一个静态方法访问该对象
1.DCL模式(双重检查模式)
package com.single;
public class SingleMode {
private static volatile SingleMode sInstance;
private SingleMode() {
}
// DCL模式
public static SingleMode getInstance() {
if (null == sInstance) {
synchronized (SingleMode.class) {
if (null == sInstance) {
sInstance = new SingleMode();
}
}
}
return sInstance;
}
}
2.懒汉模式
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (null == instance) {
instance = new Singleton();
}
return instance;
}
}
3.饿汉模式
public class Singleton {
private static Singleton instance=new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
4.静态内部类模式
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingleModeHolder.mInstance;
}
public static class SingleModeHolder {
private static Singleton mInstance = new Singleton();
}
}
二.建造者模式
将一个复杂的对象的构建与它的表示分离,使
得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
特点:修改属性不会从新创建对象
测试调用
package com.builder;
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClientLove love = new ClientLove.Builder()
.createName("晓")
.createBussiness("AI研究院")
.createPlace("深圳")
.build();
System.out.println(love.toString());
}
}
(2)具体产品类
package com.builder;
public class ClientLove {
/**
* 省略get set
*/
private String mName;
private String mBussiness;
private String mPlace;
public ClientLove(Builder builder) {
this.mName = builder.name;
this.mBussiness = builder.bussiness;
this.mPlace = builder.place;
}
public static class Builder {
public String name;
public String bussiness;
public String place;
public Builder createName(String cname) {
name = cname;
return this;
}
public Builder createBussiness(String cbussiness) {
bussiness = cbussiness;
return this;
}
public Builder createPlace(String cplace) {
place = cplace;
return this;
}
public ClientLove build() {
return new ClientLove(this);
}
}
@Override
public String toString() {
return "ClientLove [mName=" + mName + ", mBussiness=" + mBussiness + ", mPlace=" + mPlace + "]";
}
}
三.观察者模式
即发布-订阅模式 在项目中经常使用的模式
(1)抽象观察者
package observer;
public interface Observer {
//定义一个更新消息的方法
public void update(String message);
}
(2)具体观察者
package observer;
public class UserWeixin implements Observer{
//微信用户
private String name;
public UserWeixin(String name){
this.name=name;
}
@Override
public void update(String message) {
// TODO Auto-generated method stub
System.out.println(name+" - "+message);
}
}
(3)抽象被观察者
package observer;
public interface Subject {
/*
* 新增订阅者
*/
public void attach(Observer observer);
/*
* 删除订阅者
*/
public void detach(Observer observer);
/*
* 通知订阅者更新消息
*/
public void notify(String message);
}
(4)具体被观察者模式
package observer;
import java.util.ArrayList;
import java.util.List;
public class SubscriptionSubject implements Subject {
//存储订阅公众号的用户
private List<Observer> userList=new ArrayList<Observer>();
@Override
public void attach(Observer observer) {
// TODO Auto-generated method stub
userList.add(observer);
}
@Override
public void detach(Observer observer) {
// TODO Auto-generated method stub
userList.remove(observer);
}
@Override
public void notify(String message) {
// TODO Auto-generated method stub
for(Observer observer:userList){
observer.update(message);
}
}
}
(5)客户端调用
package observer;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
SubscriptionSubject mssubject=new SubscriptionSubject();
//用户
UserWeixin user1=new UserWeixin("钟惠华");
UserWeixin user2=new UserWeixin("薛翠英");
UserWeixin user3=new UserWeixin("王大婶");
//订阅公众号
mssubject.attach(user1);
mssubject.attach(user2);
mssubject.attach(user3);
//公众号更新发消息给订阅了的用户
mssubject.notify("周末去小梅沙一浪 message");
//user1 走了 退订了
mssubject.detach(user1);
//公众号更新发消息给订阅了的用户
mssubject.notify("周末去浪啊 message");
}
}