1、創(chuàng)建型模式
首先介紹一下一下簡(jiǎn)單工廠模式,簡(jiǎn)單工廠模式不屬于23種設(shè)計(jì)模式之一。
簡(jiǎn)單工廠模式
(1)單方法
簡(jiǎn)單工廠模式就是創(chuàng)建一個(gè)工廠類,對(duì)實(shí)現(xiàn)了同一個(gè)接口的實(shí)現(xiàn)類進(jìn)行實(shí)例化。
<1> 關(guān)系圖1>
<2>首次創(chuàng)建接口:2>
public interface ISend { public void send();}
<3> 然后創(chuàng)建實(shí)現(xiàn)類:3>
/** * 郵件發(fā)送實(shí)現(xiàn)類 * @author Administrator * */public class MailSend implements ISend{ @Override public void send() { System.out.println('郵件發(fā)送信息!'); }}
/** *短信發(fā)送實(shí)現(xiàn)類 * @author Administrator * */public class MessageSend implements ISend{ @Override public void send() { System.out.println('短信發(fā)送信息!'); }}
<4>創(chuàng)建簡(jiǎn)單工廠類:4>
/** * 簡(jiǎn)單工程類 * @author Administrator * */public class SigleMethodFactory { public ISend produce(String type){ if('mail'.equals(type)){ return new MailSend(); }else if('message'.equals(type)){ return new MessageSend(); } return null; }}
<5>測(cè)試5>public class SimpleFactoryTest { public static void main(String[] args){ ISend send = new SigleMethodFactory().produce('mail'); send.send(); }}
輸出:郵件發(fā)送信息!
(2)多方法
是對(duì)單方法簡(jiǎn)單工廠方法模式的改進(jìn),如果但方法傳入的字符串不正確,則不能創(chuàng)建出對(duì)象,而多個(gè)方法的簡(jiǎn)單工廠模式,是提供多個(gè)工廠方法來(lái)創(chuàng)建不同的對(duì)象。
<1>關(guān)系圖1>
<2>接口及實(shí)現(xiàn)類同單方法的簡(jiǎn)單工廠。2>
<3>工廠類:3>
public class MutiMethodSimpleFatory { public ISend produceMessage(){ return new MessageSend(); } public ISend produceMail(){ return new MailSend(); }}
<4>測(cè)試4>public class MutilMethodSmpFactoryTest { public static void main(String[] args) { ISend send = new MutiMethodSimpleFatory().produceMessage(); send.send(); }}
輸出:短信發(fā)送信息!
(3)靜態(tài)方法
靜態(tài)方法的簡(jiǎn)單工廠模式就是把工廠類里面的方法都修改為靜態(tài)方法,直接調(diào)用,無(wú)需手動(dòng)實(shí)例化簡(jiǎn)單工廠類。
總結(jié):簡(jiǎn)單工廠模式適用于需要有大量的類需要實(shí)例化,而且這些類具有共同的接口,在以上三種中,第一種情況,如果傳入的字符串錯(cuò)誤,則不能正確創(chuàng)建對(duì)象,
第三種情況相對(duì)于第二種情況來(lái)講,不需要實(shí)例化工廠類。所以大多數(shù)情況下使用第三種方式。
1.1 工廠方法模式(Factory Method)
簡(jiǎn)單工廠模式,類的創(chuàng)建依賴工廠類,如果要實(shí)現(xiàn)類的擴(kuò)展,就必須修改工廠類,所以違反了設(shè)計(jì)模式的對(duì)修改關(guān)閉,對(duì)擴(kuò)展開(kāi)放的設(shè)計(jì)原則,這個(gè)這個(gè)問(wèn)題使用
工廠方法模式就可以解決,創(chuàng)建一個(gè)工廠接口類和創(chuàng)建多個(gè)工廠的實(shí)現(xiàn)類,如果需要增加新的功能,直接增加工廠類即可解決。
<1>關(guān)系圖1>
<2>發(fā)送的接口及實(shí)現(xiàn)類同簡(jiǎn)單工廠模式2>
<3>創(chuàng)建工廠類接口3>
public interface IFactoryMethod { public ISend produce();}
<4>創(chuàng)建工廠類實(shí)現(xiàn)類4>public class MailFatory implements IFactoryMethod{ @Override public ISend produce(){ return new MailSend(); } }
public class MessageFacory implements IFactoryMethod { @Override public ISend produce() { return new MessageSend(); }}
<5>測(cè)試5>public class FactoryMethodTest { public static void main(String[] args){ IFactoryMethod factory = new MailFatory(); ISend send = factory.produce(); send.send(); }}
輸出:短信發(fā)送信息!
1.2 抽象工廠模式(Abstact Factory)
工廠方法與抽象工廠的區(qū)別:
工廠方法模式:
一個(gè)抽象產(chǎn)品類,可以派生出多個(gè)具體的產(chǎn)品類。
一個(gè)抽象工廠類,可以派生出多個(gè)具體的工廠類。
抽象工廠模式:
多個(gè)抽象產(chǎn)品類,每個(gè)抽象產(chǎn)品都可以派生出多個(gè)具體的實(shí)現(xiàn)類。
一個(gè)抽象工廠類,可以派生出多個(gè)具體的工廠類。
區(qū)別:
工廠方法只有一個(gè)抽象產(chǎn)品,抽象工廠有多個(gè)。
工廠方法的具體實(shí)現(xiàn)類只能創(chuàng)建一個(gè)類的實(shí)例,而抽象工廠可以創(chuàng)建多個(gè)。
工廠方法側(cè)重于怎么創(chuàng)建,抽象工廠側(cè)重于創(chuàng)建那些。
比如利用抽象工廠實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的不同實(shí)現(xiàn)(jdbc,hibernate)等。
<1>關(guān)系圖1>
<2>工廠接口類2>
public interface IAbstractFactory { public IMouse createMouse(); public IKeyBoard createKeyBoard();}
<3>工廠接口的實(shí)現(xiàn)類3>public class IntellFactory implements IAbstractFactory{ @Override public IMouse createMouse() { return new IntellMouse(); } @Override public IKeyBoard createKeyBoard() { return new IntellKeyBoard(); }}
public class LenevoFactory implements IAbstractFactory { @Override public IMouse createMouse() { return new LenevoMouse(); } @Override public IKeyBoard createKeyBoard() { return new LenevoKeyBoard(); }}
<4>實(shí)體類接口4>public interface IMouse { public void click();}
public interface IKeyBoard { public void hit();}
<5>實(shí)體類接口實(shí)現(xiàn)類5>public class LenevoMouse implements IMouse{ @Override public void click() { System.out.println('lenevo mouse'); } }
public class IntellMouse implements IMouse{ @Override public void click() { System.out.println('intell mouse'); }}
public class LenevoKeyBoard implements IKeyBoard{ @Override public void hit() { System.out.println('lenevo keyBoard'); }}
public class IntellKeyBoard implements IKeyBoard { @Override public void hit() { System.out.println('intell keyBoard'); }}
<5>測(cè)試5>public class AbstractFatoryTest { public static void main(String[] args) { IAbstractFactory factory = new IntellFactory(); IKeyBoard keyBoard = factory.createKeyBoard(); IMouse mouse = factory.createMouse(); keyBoard.hit(); mouse.click(); }}
輸出:
intell keyBoard
intell mouse
1.3 單例模式(Sigleton)
單例模式的特點(diǎn):
單例類必須只有一個(gè)實(shí)例;
單例類必須自己創(chuàng)建自己的實(shí)例;
單例類必須給其他所有實(shí)例提供這一個(gè)對(duì)象。
單例模式就是要保證某個(gè)類只有一個(gè)實(shí)例,并且自行實(shí)例化并向系統(tǒng)提供這個(gè)實(shí)例。在計(jì)算及系統(tǒng)中,線程池,日志,
緩存,打印機(jī)等常被設(shè)計(jì)成單例類。
<1>懶漢式單例1>
/** * 線程不安全的 * @author Administrator * */public class LazySingleton { //私有的靜態(tài)變量,防止被引用 private static LazySingleton instance = null; //私有的構(gòu)造器,防止被實(shí)例化 private LazySingleton(){ } private static LazySingleton getInstance(){ if(instance == null){ instance = new LazySingleton(); } return instance; }}
/** * 線程安全的懶漢式 * @author Administrator * */public class SafeLazySingleton { private static SafeLazySingleton instance = null; private static synchronized SafeLazySingleton init(){ if(instance == null){ return new SafeLazySingleton(); } return instance; } public static SafeLazySingleton getInstance(){ if(instance == null){ init(); } return instance; }}
<2>餓漢式單例2>
public class HungrySingle { private static HungrySingle instance = new HungrySingle(); private HungrySingle(){ } public static HungrySingle getInstance(){ return instance; }}
1.4 建造者模式(Builder)
工廠模式提供的是創(chuàng)建單個(gè)類的模式,建造者模式將多個(gè)產(chǎn)品集中起來(lái)進(jìn)行管理,用來(lái)創(chuàng)建集合對(duì)象。
所以與工程模式的區(qū)別就是:工廠模式關(guān)注的是創(chuàng)建單個(gè)產(chǎn)品,而建造者模式則關(guān)注創(chuàng)建復(fù)合對(duì)象。
具體選擇哪一種模式來(lái)創(chuàng)建對(duì)象需要依據(jù)具體的情況來(lái)定。
1.5 原型模式(ProtoType)
原形模式,就是講一個(gè)對(duì)象作為原型,對(duì)其進(jìn)行復(fù)制,克隆,產(chǎn)生一個(gè)與原來(lái)對(duì)象相類似的新對(duì)象。
一個(gè)原型類只需要實(shí)現(xiàn)cloneable接口,覆蓋clone方法(),super.clone()調(diào)用object的clone方法完成復(fù)制。
淺復(fù)制:將一個(gè)對(duì)象復(fù)制后,基本類型的變量會(huì)被重新創(chuàng)建,而引用類型,指向的還是原對(duì)象所指向的。
深復(fù)制:無(wú)論基本類型的變量還是引用類型的變量,都會(huì)重新的創(chuàng)建一份。
public class ProtoType implements Cloneable{ //淺復(fù)制 public Object clone() throws CloneNotSupportedException{ ProtoType proto = (ProtoType)super.clone(); return proto; } //深復(fù)制 public Object deepClone() throws IOException, ClassNotFoundException{ //寫入當(dāng)前對(duì)象的二進(jìn)制流 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); //讀出二進(jìn)制流產(chǎn)生的新對(duì)象 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); }}
所以說(shuō),深復(fù)制需要采用流的方式讀入當(dāng)前對(duì)象的二進(jìn)制輸入,然后在寫出二進(jìn)制數(shù)據(jù)到新的對(duì)象。
2、結(jié)構(gòu)型模式
2.1 適配器模式(Adapter)
適配器模式是將某個(gè)類的接口轉(zhuǎn)化成客戶端需要的另外一個(gè)接口,目的是消除接口不匹配所造成的類的兼容性問(wèn)題。
主要分為3類,類的適配器模式,對(duì)象的適配器模式,接口的適配器模式。
2.1.1 類的適配器
<1>關(guān)系圖1>
核心思想,有一個(gè)Source類,擁有一個(gè)方法,待適配,目標(biāo)接口是ITarget ,通過(guò)ClassAdapter將Source的功能擴(kuò)展到ITarget.
<2>待適配的類2>
public class Source { public void method1(){ System.out.println('Source method1'); }}
<3>目標(biāo)接口3>public interface ITarget { public void method1(); public void method2();}
<4>類適配器4>public class ClassAdapter extends Source implements ITarget{ @Override public void method2() { System.out.println('ClassAdapter method2'); }}
<5>測(cè)試5>public class ClassAdapterTest { public static void main(String[] args){ ITarget target = new ClassAdapter(); target.method1(); target.method2(); }}
輸出:
Source method1
ClassAdapter method2
這樣ITarget接口就具備了Source類的功能。
2.1.2 對(duì)象的適配器
基本思路與類的適配器相同,但是這次不繼承待適配的類(Source),而是持有待適配器類的對(duì)象(Source)。
<1>關(guān)系圖1>
<2>需要對(duì)適配器類進(jìn)行調(diào)整2>
public class ObjectAdapter implements ITarget{ Source source = null; public ObjectAdapter(Source source){ this.source = source; } @Override public void method1() { source.method1(); } @Override public void method2() { System.out.println('ObjectAdapter method2'); } }
2.1.3 接口適配器模式
有些時(shí)候,我們寫一個(gè)接口,里面會(huì)有多個(gè)抽象方法,當(dāng)我們寫接口的實(shí)現(xiàn)類的時(shí)候,必須要實(shí)現(xiàn)這個(gè)接口的所有方法,這明顯比較浪費(fèi),
因?yàn)椴⒉皇撬械姆椒ǘ际俏覀兯枰?,有時(shí)需要一些就夠了,此處為了解決這個(gè)問(wèn)題,引入了接口的適配器模式,借助一個(gè)抽象類,該
抽象類實(shí)現(xiàn)了該接口,實(shí)現(xiàn)了所有的方法,而我們不和原始的接口打交道,只和該抽象類取得聯(lián)系,所以我們寫一個(gè)類,繼承該抽象類,重
寫我們需要的方法就行。
<1>關(guān)系圖1>
<2>適配器類2>
public abstract class InterfaceAdapter implements ITarget{ @Override public void method1() { } @Override public void method2() { }}
<3>具體實(shí)現(xiàn)類3>public class Sub1 extends InterfaceAdapter{ @Override public void method1() { System.out.println('Sub1 method1'); }}
public class Sub2 extends InterfaceAdapter { @Override public void method2() { System.out.println('Sub2 method2'); }}
總結(jié):類的適配器:希望將一個(gè)類轉(zhuǎn)化成滿足另外一個(gè)接口的類時(shí),可以使用類的適配器模式,創(chuàng)建一個(gè)類,繼承待適配類并實(shí)現(xiàn)接口接口。
對(duì)象適配器:當(dāng)希望把一個(gè)對(duì)象轉(zhuǎn)換成滿足另一個(gè)新接口的對(duì)象是,可以創(chuàng)建一個(gè)類,持有待適配的類的對(duì)象,在創(chuàng)建的類中,調(diào)用待適配的類的對(duì)象的方法即可。
接口適配器:當(dāng)不希望實(shí)現(xiàn)一個(gè)接口的所有方法時(shí),可以創(chuàng)建一個(gè)抽象類,實(shí)現(xiàn)所有方法,我們寫別的類時(shí),直接繼承抽象類即可。
2.2裝飾器模式(Decorator)
裝飾器模式,是為了給一個(gè)對(duì)象增加新的功能,而且是動(dòng)態(tài)的,要求裝飾的對(duì)象和被裝飾的對(duì)象實(shí)現(xiàn)同一個(gè)接口,裝飾對(duì)象持有被裝飾對(duì)象的實(shí)例。
<1>關(guān)系圖1>
<2>接口2>
public interface DecoraterInterface { public void method1();}
<3>被裝飾類3>public class Source implements DecoraterInterface { @Override public void method1() { System.out.println('Source method1'); }}
<4>裝飾類4>public class Decorator implements DecoraterInterface{ Source source = null; public Decorator(Source source){ this.source = source; } @Override public void method1() { System.out.println('前裝飾'); source.method1(); System.out.println('后裝飾'); } }
裝飾器的應(yīng)用場(chǎng)景:
1、需要擴(kuò)展一個(gè)類的功能。
2、動(dòng)態(tài)增加一個(gè)類的功能,繼承只是靜態(tài)的。
缺點(diǎn)是產(chǎn)生過(guò)多相似的類,不容易拍錯(cuò)。
2.3 代理模式
代理模式就是多一個(gè)代理類出來(lái),替換原來(lái)對(duì)象進(jìn)行一些操作,比如我們租房子需要找中介,打官司需要找律師。
<1>關(guān)系圖1>
<2>接口2>
public interface IProxyInterface { public void method();}
<3>被代理類3>public class Source implements DecoraterInterface { @Override public void method1() { System.out.println('Source method1'); }}
<4>代理類4>public class Proxy implements IProxyInterface{ Source source = null; public Proxy(){ source = new Source(); } @Override public void method() { System.out.println('代理前'); source.method(); System.out.println('代理后'); }}
<5>測(cè)試類5>public class ProxyTest { public static void main(String[] args) { IProxyInterface proxy = new Proxy(); proxy.method(); }}
輸出:
代理前
Source method!
代理后
總結(jié):代理模式與裝飾器模式的區(qū)別
代理模式關(guān)注的是如何動(dòng)態(tài)給類添加功能,代理模式關(guān)注的是控制對(duì)象的訪問(wèn)。
用代理模式,代理類會(huì)對(duì)它的客戶隱藏具體的對(duì)象信息,因此,當(dāng)我們使用代理類的時(shí)候,一般在代理類里面創(chuàng)建一個(gè)對(duì)象。
用裝飾器模式,對(duì)象一般作為一個(gè)原始參數(shù)傳遞給裝飾者的構(gòu)造器。
2.4 外觀模式(Facade)
外觀模式,是為了解決類與類之間的依賴關(guān)系,有將spring,將類與類之間的關(guān)系在配置文件中進(jìn)行管理,外觀模式是將
類與類之間的關(guān)系放置在一個(gè)Facade類中.降低了類與類之間的耦合程度,該模式?jīng)]有涉及到接口。
<1>關(guān)系圖1>
<2>實(shí)體類2>
public class Cpu { public void start(){ System.out.println('Cpu start'); } public void shutdown(){ System.out.println('cpu shutdown'); }}
public class Memory { public void start(){ System.out.println('Memory start'); } public void shutdown(){ System.out.println('Memory shutdown'); }}
<3>外觀類3>public class ComputerFacade { private Memory memory = null; private Cpu cpu = null; public ComputerFacade(){ memory = new Memory(); cpu = new Cpu(); } public void startup(){ memory.start(); cpu.start(); } public void shutdown(){ memory.shutdown(); memory.shutdown(); }}
<4>測(cè)試類4>public class FacadeTest { public static void main(String[] args) { ComputerFacade computer = new ComputerFacade(); computer.startup(); computer.shutdown(); }}
輸出:
Memory start
Cpu start
Memory shutdown
Memory shutdown
總結(jié):如果沒(méi)有ComputerFacade類,則Memory與Cpu類則相互依賴,修改一個(gè)類,就會(huì)導(dǎo)致另外類的修改。
有了ComputerFacade類,他們之間的關(guān)系被放在了ComputerFacade類里面,這樣就起了解耦的作用,這就是外觀模式。
2.5 橋接模式(Bridge)
橋接模式就是把事物和其具體的類分開(kāi),使他們各自獨(dú)立變化。橋接的用意是,將抽象化與實(shí)現(xiàn)化解耦,使得二者可以獨(dú)立
變化,向我們常用的JDBC橋DriverManager一樣,JDBC進(jìn)行連接數(shù)據(jù)庫(kù)的時(shí)候,在各個(gè)數(shù)據(jù)庫(kù)之間進(jìn)行切換,基本不需要
動(dòng)太多代碼,甚至絲毫不用動(dòng),原因是因?yàn)镴DBC提供了統(tǒng)一的接口,每個(gè)數(shù)據(jù)庫(kù)各自的實(shí)現(xiàn),用一個(gè)叫數(shù)據(jù)庫(kù)驅(qū)動(dòng)的程序
來(lái)橋接就行了。
<1>關(guān)系圖1>
<2>定義接口2>
public interface SourceAble { public void method();}
<3>定義實(shí)現(xiàn)類3>public class Sub1 implements SourceAble { @Override public void method() { System.out.println('Sub1 method!'); }}
public class Sub2 implements SourceAble { @Override public void method() { System.out.println('Sub2 method!'); }}
<4>定義橋接類 持有SourceAble的實(shí)例4>
public abstract class Bridge { SourceAble source = null; public void method(){ source.method(); } public SourceAble getSource() { return source; } public void setSource(SourceAble source) { this.source = source; } }
public class MyBridge extends Bridge { public void method(){ getSource().method(); }}
<5>測(cè)試類5>public class BridgeTest { public static void main(String[] args) { SourceAble source = new Sub1(); Bridge bridge = new MyBridge(); bridge.setSource(source); bridge.method(); } }
輸出:
Sub1 method!
這樣通過(guò)對(duì)Bridge的調(diào)用,實(shí)現(xiàn)了對(duì)接口SourceAble的實(shí)現(xiàn)類SourceSub1和SourceSub2的調(diào)用。接下來(lái)在畫(huà)一個(gè)圖,是JDBC的連接原理,
有數(shù)據(jù)庫(kù)學(xué)習(xí)基礎(chǔ)的,一結(jié)合都懂了。
2.6 組合模式(Composite)
組合模式有時(shí)又叫部分-整體模式,在處理類似樹(shù)形結(jié)構(gòu)的問(wèn)題時(shí)比較方便。
<1>關(guān)系圖1>
<2>實(shí)體類2>
public class TreeNode { private String name; private TreeNode parent; private Vector children = new Vector(); public TreeNode(String name){ this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public TreeNode getParent() { return parent; } public void setParent(TreeNode parent) { this.parent = parent; } //添加孩子節(jié)點(diǎn) public void add(TreeNode node){ children.add(node); } //刪除孩子節(jié)點(diǎn) public void remove(TreeNode node){ children.remove(node); } //取得孩子節(jié)點(diǎn) public Enumeration getChildren(){ return children.elements(); } }
public class Tree { TreeNode root = null; public Tree(String name) { root = new TreeNode(name); } public static void main(String[] args) { Tree tree = new Tree('A'); TreeNode nodeB = new TreeNode('B'); TreeNode nodeC = new TreeNode('C'); nodeB.add(nodeC); tree.root.add(nodeB); System.out.println('build the tree finished!'); } }
使用場(chǎng)景:將多個(gè)對(duì)象組合在一起進(jìn)行操作,常用于表示樹(shù)結(jié)構(gòu),錄入二叉樹(shù)等。
2.7 享元模式(Flyweight)
享元模式的主要目的是實(shí)現(xiàn)對(duì)象的共享,即共享池,當(dāng)系統(tǒng)中對(duì)象多的時(shí)候可以減少內(nèi)存的開(kāi)銷。通常與工廠模式一起使用。
<1>關(guān)系圖1>
FlyWeightFactory負(fù)責(zé)創(chuàng)建和管理享元單元,當(dāng)一個(gè)客戶端請(qǐng)求時(shí),工廠需要檢查當(dāng)前對(duì)象池中是否有符合條件的對(duì)象,如果有,
就返回已經(jīng)存在的對(duì)象,F(xiàn)lyWeight是超類。一提到共享池,我們很容易聯(lián)想到j(luò)ava里面的JDBC連接池,想想每個(gè)連接的特點(diǎn),我們
不難總結(jié)出:適合于做共享的一些個(gè)對(duì)象,他們有一些共有的屬性,就拿數(shù)據(jù)庫(kù)連接池來(lái)說(shuō),url、driverClassName、username、
password及dbname,這些屬性在每個(gè)連接說(shuō)都是一樣的,所以就適合用享元模式來(lái)處理,建一個(gè)工廠類,將上述類似屬性作為內(nèi)部
數(shù)據(jù),其他的作為外部數(shù)據(jù),在方法調(diào)用時(shí),當(dāng)做參數(shù)傳進(jìn)來(lái),這樣就節(jié)省了空間,減少了實(shí)例的數(shù)量。
看個(gè)例子:
<2>代碼2>
public class ConnectionPool { private Vector pool; /*公有屬性*/ private String url = 'jdbc:mysql://localhost:3306/test'; private String username = 'root'; private String password = 'root'; private String driverClassName = 'com.mysql.jdbc.Driver'; private int poolSize = 100; private static ConnectionPool instance = null; Connection conn = null; /*構(gòu)造方法,做一些初始化工作*/ private ConnectionPool() { pool = new Vector(poolSize); for (int i = 0; i < poolsize;="" i++)="" {="" try="" {="" class.forname(driverclassname);="" conn="DriverManager.getConnection(url," username,="" password);="" pool.add(conn);="" }="" catch="" (classnotfoundexception="" e)="" {="" e.printstacktrace();="" }="" catch="" (sqlexception="" e)="" {="" e.printstacktrace();="" }="" }="" }="" 返回連接到連接池="" */="" public="" synchronized="" void="" release()="" {="" pool.add(conn);="" }="" 返回連接池中的一個(gè)數(shù)據(jù)庫(kù)連接="" */="" public="" synchronized="" connection="" getconnection()="" {="" if="" (pool.size()=""> 0) { Connection conn = pool.get(0); pool.remove(conn); return conn; } else { return null; } } }
通過(guò)連接池的管理,實(shí)現(xiàn)了數(shù)據(jù)庫(kù)鏈接的共享,不需要每一次都從新鏈接,節(jié)省了數(shù)據(jù)庫(kù)重新創(chuàng)建的開(kāi)銷,提升了系統(tǒng)的性能。
3.行為型模式
第一類:父類與子類 策略模式,模板方法模式第二類:類與類之間 觀察者模式,命令模式,責(zé)任鏈模式,迭代子模式
第三類:類的狀態(tài) 備忘錄模式,狀態(tài)模式
第四類:通過(guò)中間類 訪問(wèn)者模式,中介者模式,解釋器模式
3.1 策略模式
策略模式就是定義一系列算法,并將每個(gè)算法封裝起來(lái),使他們可以相互替換,且算法的變化的不會(huì)影響到使用他的客戶。
需要設(shè)計(jì)一個(gè)接口,為一系列的實(shí)現(xiàn)類提供統(tǒng)一的方法,多個(gè)實(shí)現(xiàn)類事項(xiàng)該接口,設(shè)計(jì)一個(gè)抽象類(可有可無(wú)),提供輔助函數(shù)。
<1>關(guān)系圖1>
<2>代碼2>
待完成
總結(jié):策略模式的決定權(quán)在客戶,系統(tǒng)本身提供不同的算法去實(shí)現(xiàn)。
3.2 模板方法模式(Template method)
一個(gè)抽象類中,有一個(gè)主方法,在定義1..n個(gè)方法,可以是抽象的,也可以是實(shí)際的。
定義一個(gè)類繼承該抽象類,重新抽象方法,通過(guò)調(diào)用抽象類,實(shí)現(xiàn)對(duì)子類的調(diào)用。
<1>關(guān)系圖1>
3.3觀察者模式
就像我們訂閱郵件或文章一樣,如果有更新,會(huì)及時(shí)同時(shí)我們,如果一個(gè)對(duì)象有變化,其他依賴該對(duì)象的對(duì)象都會(huì)產(chǎn)生變化。
<1>關(guān)系圖1>
3.4 迭代子模式(Interator)
顧名思義,迭代器模式就是順序訪問(wèn)聚集中的對(duì)象.
<1>關(guān)系圖1>
3.5 責(zé)任鏈模式(Chain of Responsibility)
責(zé)任鏈模式,有多個(gè)對(duì)象,每個(gè)對(duì)象都持有下一個(gè)對(duì)象的引用,這樣就會(huì)形成一條鏈,請(qǐng)求
在這條鏈上傳遞,值到某一個(gè)對(duì)象決定處理該請(qǐng)求。
<1>關(guān)系圖1>
AbstractHandle提供了get set方法,方便對(duì)象的修改,MyHandel是核心,實(shí)例化后生成一系列相互持有的對(duì)象。
3.6 命令模式(Commond)
例如司令員讓士兵去干一件事情,從整個(gè)事情的角度來(lái)講,司令員的作用是發(fā)送口令,口令經(jīng)過(guò)傳遞,傳到了
士兵的耳朵,士兵去執(zhí)行。二者互相解耦,任何一方都不用去依賴其他人,司令員要的是結(jié)果,不會(huì)去關(guān)注士兵
是怎么實(shí)現(xiàn)的。
<1>關(guān)系圖1>
3.7 備忘錄模式
3.8 狀態(tài)模式
3.9 中介者模式
3.10 訪問(wèn)者模式
3.11 解釋器模式