设计模式——单例模式、建造者模式、观察模式、代理模式

      设计模式分为三类:

       创建类型模式:单例、工厂、建造者...

       结构型设计模式:适配器、代理、桥接...

       行为型设计模式:策略、观察者、迭代器...

 

   一.单例模式

      保证一个类只有一个实例,并提供一个全局访问点   使用场景:项目中共享的数据 消耗资源多的对象 工具类对象

      特点:构造方法为私有、提供一个静态方法访问该对象 

   

 

     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");
       
	}

}

 

 

 

 

 

 

 

 

 

 


 

 

 

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值