常用的設(shè)計(jì)模式:?jiǎn)卫J剑S模式封豪,觀察者模式谴轮,代理模式,其他的我使用不多。
單例模式
最常見(jiàn)也最簡(jiǎn)單
分為幾種實(shí)現(xiàn):
懶漢式
:
public class Single {
private static Single single;
public synchronized static Single getInstance() {
if (single == null) {
single = new Single();
return single;
} else {
return single;
}
}
}
雙重鎖 double check
public class Single {
// 防止指令重排序 一般創(chuàng)建對(duì)象
// 1.給 instance 分配內(nèi)存
// 2.調(diào)用 Singleton 的構(gòu)造函數(shù)來(lái)初始化成員變量
// 3.將instance對(duì)象指向分配的內(nèi)存空間(執(zhí)行完這步 instance 就為非 null 了)
// 虛擬機(jī)會(huì)優(yōu)化 有時(shí)候執(zhí)行順序 會(huì)是 132
private volatile static Single single;
public static Single getInstance() {
if (single == null) {
synchronized (Single.class) {
if (single == null) {
// 保證不會(huì)多次生成對(duì)象
single = new Single();
return single;
}
}
}
return single;
}
}
餓漢式
public class Single{
// 類加載時(shí)就初始化 不會(huì)有線程安全問(wèn)題
private static final Single instance = new Single();
public static Single getInstance(){
return instance;
}
}
工廠模式
在Android中很多地方用到
舉個(gè)簡(jiǎn)單的工廠模式例子吹埠,其他的說(shuō)法都是基礎(chǔ)的變種:
public class MobileFactory {
public static Moblie createMobile(String type) {
if (type.equals("xiaomi")) {
return new XiaomiMoblie();
} else {
return new OtherMoblie();
}
}
}
interface Moblie {
}
class XiaomiMoblie implements Moblie {
}
class OtherMoblie implements Moblie {
}
MobileFactory.createMobile("xiaomi");
觀察者模式
角色 :觀察者 被觀察者
簡(jiǎn)單實(shí)現(xiàn)一下觀察者模式,核心:被觀察者發(fā)生變化第步,通知觀察者
/**
* 觀察者
*/
class Obsever {
public Obsever(Observale o){
o.addObsever(this);
}
public void update() {
System.out.println("被通知更新");
}
}
/**
* 被觀察者
*/
class Observale {
// 實(shí)現(xiàn)一對(duì)多 一個(gè)被觀察者對(duì)應(yīng)多個(gè)觀察者
private List<Obsever> list = new ArrayList<>();
public void addObsever(Obsever obsever) {
list.add(obsever);
}
// Observale 變化可以通過(guò)這個(gè)通知觀察者
public void notifyObsevers() {
for (int i = 0; i < list.size(); i++) {
list.get(i).update();
}
}
}
Java 已經(jīng)提供了快速創(chuàng)建觀察者的方法
提供了一個(gè)Observable類以及一個(gè)Observer接口
setChanged();
notifyObservers();
通知觀察者更新
代理模式
interfece Print{
public void print();
}
// 真實(shí)類
class RealObject implements Print{
public void print() {
System.out.print("realObject");
}
}
// 代理類
class Proxy implements Print{
private Print print;
public Proxy(Print print){
this.print = print;
}
public void print() {
print.print();
}
}