Java設計模式之Builder和Decorator
Java設計模式
之
Builder和Decorator
1、建造者模式(Builder)
工廠類模式提供的是建立單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來建立複合物件,所謂複合物件就是指某個類具有不同的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來得到的。我們看一下程式碼:
一個Sender介面,兩個實現類MailSender和SmsSender。最後,建造者類如下:
1. public class Builder {
2.
3. private List<Sender> list = new ArrayList<Sender>();
4.
5. public void produceMailSender(int count){
6. for(int i=0; i<count; i++){
7. list.add(new MailSender());
8. }
9. }
10.
11. public void produceSmsSender(int count){
12. for(int i=0; i<count; i++){
13. list.add(new SmsSender());
14. }
15. }
16. }
測試類:
1. public class Test {
2. public static void main(String[] args) {
3.
Builder builder = new
4. builder.produceMailSender(10);
5. }
6. }
從這點看出,建造者模式將很多功能整合到一個類裡,這個類可以創造出比較複雜的東西。所以與工程模式的區別就是:工廠模式關注的是建立單個產品,而建造者模式則關注建立符合物件,多個部分。因此,是選擇工廠模式還是建造者模式,依實際情況而定。
2、裝飾模式(decorator)
顧名思義,裝飾模式就是給一個物件增加一些新的功能,而且是動態的,要求裝飾物件和被裝飾物件實現同一個介面,裝飾物件持有被裝飾物件的例項,關係圖如下:
Source類是被裝飾類,Decorator類是一個裝飾類,可以為Source類動態的新增一些功能,程式碼如下:
定義一個Sourceable介面,並在裡面定義某個方法。
1. public interface Sourceable {
2. public void method();
3. }
建立一個Source類並實現Sourceable介面。
1. public class Source implements Sourceable {
2. @Override
3. public void method() {
4. System.out.println("the original method!");
5. }
6. }
建立一個Decorator類,它也實現了Sourceable介面。並且有一個帶參的建構函式,引數就是Sourceable介面。
1. public class Decorator implements Sourceable {
2.
3. private Sourceable source;
4. public Decorator(Sourceable source){
5. super();
6. this.source = source;
7. }
8. @Override
9. public void method() {
10. System.out.println("before decorator!");
11. source.method();
12. System.out.println("after decorator!");
13. }
14. }
測試類:
1. public class DecoratorTest {
2.
3. public static void main(String[] args) {
4. Sourceable source = new Source();
5. Sourceable obj = new Decorator(source);
6. obj.method();
7. }
8. }
輸出:
before decorator!
the original method!
after decorator!
裝飾器模式的應用場景:
1、需要擴充套件一個類的功能。
2、動態的為一個物件增加功能,而且還能動態撤銷。(繼承不能做到這一點,繼承的功能是靜態的,不能動態增刪。)
缺點:產生過多相似的物件,不易排錯!