單例模式
- (1)餓漢式 開發(fā)用這種方式儒老。
//餓漢式(聲明靜態(tài)對(duì)象時(shí)就初始化對(duì)象)
public class Singleton
{
// 1,私有構(gòu)造函數(shù)
private Singleton()
{
}
// 2,創(chuàng)建本類對(duì)象
private static Singleton mInstance = new Singleton();
// 3,對(duì)外提供公共的訪問方法
public static Singleton getInstance()
{
return mInstance ;
}
}
- (2)懶漢式 (多線程的問題)
//懶漢式,單例的延遲加載模式(線程不安全)
public class Singleton
{
// 1,私有構(gòu)造函數(shù)
private Singleton()
{
}
// 2,聲明一個(gè)本類的引用
private static Singleton s;
// 3,對(duì)外提供公共的訪問方法
public static Singleton getInstance()
{
if (s == null)
{
// 線程1,線程2...多線程時(shí)可能會(huì)創(chuàng)建多個(gè)對(duì)象
s = new Singleton();
}
return s;
}
}
多線程安全比原,但是效率低:
public class Singleton {
private static Singleton instance;
private Singleton (){}
// 每次調(diào)用都同步莫其,這樣會(huì)消耗不必要的資源
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
雙重鎖定:
public class Singleton
{
// 1,私有構(gòu)造函數(shù)
private Singleton()
{
}
// 2,聲明一個(gè)本類的引用
private static Singleton s;
// 3,對(duì)外提供公共的訪問方法墓阀,加鎖塌碌,解決多線程同時(shí)訪問會(huì)創(chuàng)建多個(gè)對(duì)象的問題
public static Singleton getInstance()
{
if (s == null)
{
synchronized (Singleton.class)
{
if (s == null)
{
s = new Singleton();
}
}
}
return s;
}
}
- (3)靜態(tài)內(nèi)部類方式實(shí)現(xiàn)
public class Singleton {
private Singleton() {}
private static class SingletonHolder
{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance()
{
return SingletonHolder.INSTANCE;
}
}
這種方式舆驶,第一次加載Singleton這個(gè)類時(shí)橱健,不會(huì)加載SingletonHolder。只有第一次調(diào)用 getInstance()時(shí)才會(huì)初始化實(shí)例INSTANCE沙廉。即保證了線程安全畴博,也保證了單例對(duì)象的唯一性,同時(shí)也延遲了單例的初始化蓝仲,是推薦使用的單例模式實(shí)現(xiàn)方式俱病。
簡(jiǎn)單工廠模式
- A:簡(jiǎn)單工廠模式概述
- 又叫靜態(tài)工廠方法模式官疲,它定義一個(gè)具體的工廠類負(fù)責(zé)創(chuàng)建一些類的實(shí)例
- B:優(yōu)點(diǎn)
- 客戶端不需要在負(fù)責(zé)對(duì)象的創(chuàng)建,從而明確了各個(gè)類的職責(zé)
- C:缺點(diǎn)
- 這個(gè)靜態(tài)工廠類負(fù)責(zé)所有對(duì)象的創(chuàng)建亮隙,如果有新的對(duì)象增加途凫,或者某些對(duì)象的創(chuàng)建方式不同,就需要不斷的修改工廠類溢吻,不利于后期的維護(hù)
舉例:
class AnimalFactory {
private AnimalFactory() {}
public static Animal createAnimal(String animalName)
{
if(“dog”.equals(animalName))
{
return new Dog();
}
else if(“cat”.equals(animale))
{
return new Cat();
}else
{
return null;
}
}
}
工廠方法模式
- A:工廠方法模式概述
- 工廠方法模式中抽象工廠類負(fù)責(zé)定義創(chuàng)建對(duì)象的接口维费,具體對(duì)象的創(chuàng)建工作由繼承抽象工廠的具體類實(shí)現(xiàn)。
- B:優(yōu)點(diǎn)
- 客戶端不需要在負(fù)責(zé)對(duì)象的創(chuàng)建促王,從而明確了各個(gè)類的職責(zé)犀盟,如果有新的對(duì)象增加,只需要增加一個(gè)具體的類和具體的工廠類即可蝇狼,不影響已有的代碼阅畴,后期維護(hù)容易,增強(qiáng)了系統(tǒng)的擴(kuò)展性
- C:缺點(diǎn)
- 需要額外的編寫代碼迅耘,增加了工作量
- D: 舉例
動(dòng)物抽象類:public abstract Animal { public abstract void eat(); } 工廠接口:public interface Factory {public abstract Animal createAnimal();} 具體狗類:public class Dog extends Animal {} 具體貓類:public class Cat extends Animal {} 開始贱枣,在測(cè)試類中每個(gè)具體的內(nèi)容自己創(chuàng)建對(duì)象,但是颤专,創(chuàng)建對(duì)象的工作如果比較麻煩纽哥,就需要有人專門做這個(gè)事情,所以就知道了一個(gè)專門的類來創(chuàng)建對(duì)象栖秕。發(fā)現(xiàn)每次修改代碼太麻煩春塌,用工廠方法改進(jìn),針對(duì)每一個(gè)具體的實(shí)現(xiàn)提供一個(gè)具體工廠簇捍。 狗工廠:public class DogFactory implements Factory { public Animal createAnimal() {…} } 貓工廠:public class CatFactory implements Factory { public Animal createAnimal() {…} }
適配器模式
-
類適配器模式
- a.什么是類適配器
- 在使用監(jiān)聽器的時(shí)候, 需要定義一個(gè)類事件監(jiān)聽器接口.
- 通常接口中有多個(gè)方法, 而程序中不一定所有的都用到, 但又必須重寫, 這很繁瑣.
- 適配器簡(jiǎn)化了這些操作, 我們定義監(jiān)聽器時(shí)只要繼承適配器, 然后重寫需要的方法即可.
- b.適配器原理
- 適配器就是一個(gè)類, 實(shí)現(xiàn)了監(jiān)聽器接口, 所有抽象方法都重寫了, 但是方法全是空的.
- 適配器類需要定義成抽象的,因?yàn)閯?chuàng)建該類對(duì)象,調(diào)用空方法是沒有意義的
- 目的就是為了簡(jiǎn)化程序員的操作, 定義監(jiān)聽器時(shí)繼承適配器, 只重寫需要的方法就可以了.
- a.什么是類適配器
-
對(duì)象適配器模式(常用)
- 通常情況下只壳,客戶端可以通過目標(biāo)類的接口訪問它所提供的服務(wù)。但有時(shí)垦写,現(xiàn)有的類雖然可以滿足客戶類的功能需要吕世,但是它所提供的接口不一定是客戶類所期望的,這可能是因?yàn)楝F(xiàn)有類中方法名與目標(biāo)類中定義的方法名不一致等原因所導(dǎo)致的梯投。
- 在適配器模式中可以定義一個(gè)包裝類命辖,包裝不兼容接口的對(duì)象,這個(gè)包裝類指的就是適配器(Adapter)分蓖,它所包裝的對(duì)象就是適配者(Adaptee)尔艇,即被適配的類。
- 適配器可以使由于接口不兼容而不能交互的類可以一起工作么鹤。
裝飾模式
- 什么是裝飾模式
- 動(dòng)態(tài)地將責(zé)任附加到對(duì)象上终娃,若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案蒸甜。
- 使用裝飾器模式的時(shí)候棠耕,通常的做法是將原始對(duì)象作為一個(gè)參數(shù)傳給裝飾者的構(gòu)造器余佛。
- 案例
- java里的BufferedInputStream的設(shè)計(jì)
- public BufferedInputStream(InputStream in),BufferedInputStream包裝了InputStream窍荧,擴(kuò)展了功能
代理模式
- 給某一個(gè)對(duì)象提供一個(gè)代理辉巡,并由代理對(duì)象控制對(duì)原對(duì)象的引用
- 當(dāng)使用代理模式的時(shí)候,通常在一個(gè)代理類中創(chuàng)建一個(gè)對(duì)象的實(shí)例
- 代理模式對(duì)代理的對(duì)象施加控制蕊退,并不提供對(duì)象本身的增強(qiáng)功能