Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android Ap 開發 設計模式第八篇:抽象工廠模式

Android Ap 開發 設計模式第八篇:抽象工廠模式

編輯:Android開發實例

  Abstract Factory Pattern

模式解讀

  abstract 是“抽象”,factory 是“工廠”,所以合起來abstract factory 就是“抽象工廠”的意思。Abstract Factory Pattern 中的抽象工廠則是把各種抽象零件合成抽象產品。換句話說,處理的重點是在接口(api)而不是零件的具體實現。只利用接口(API)就能把零件組合成產品。

 

  模板方法模式和生成模式的情形 是在子類進行具體的實現,而抽象工廠模式也同樣是由子類來處理具體 的實現。在子類就會出現具體工廠利用具體零件組合而成的具體產品。

 

 

程序示例

  本篇涉及的類較多,較之單例模式而言理解真來比較難。一步步來吧。

  本例將使用抽象工廠,制作輸出一個HTML語言顯示在Android 的文本上。由於涉及類比較多,先上UML圖,再一一解釋:

 

 

抽象零件:Item 類

  caption字段 是此項目的“標題”。

  makeHtml 方法是抽象方法,須等待子類進行實現。一旦調用 此方法時,其返回值即為HTML字符串(子類要有這樣的執行功能)。代碼:

 

public abstract class Item {

    protected String caption;
    
    public Item(String caption){
        this.caption=caption;
    }
    
    public abstract String makeHTML();
}

 

抽象零件:Link 類

  Link 類是以抽象方式表示 HTML超鏈接的類。

  url 字段用來存儲超鏈網站的URL。該抽象類實現Item 抽象類。代碼 :

 

/**
 * 以抽象方式 表示HTML超鏈接的類
 * @author Administrator
 *
 */
public abstract class Link extends Item{

    protected String url;
    public Link(String caption,String url) {
        super(caption);
        // TODO Auto-generated constructor stub
        this.url=url;
    }

     

}

 

 

 抽象零件:Tray類

  Tray 類是表示 收集一個以上的Link 或Tray 類。

  Link 和Tray 則利用add 方法把它們 找出來。add 方法對於“LINK”和“Tray” 這部分的表現方式則是將Link 和 Tray 的父類Item 設為參數。

  Tray 類繼承 了Item 類的抽象方法makeHTML,但並未實現。所以Tray 類也是抽象類。代碼 :

 

/**
 * 表示收集一個以上的Link 或Tray的類
 * @author Administrator
 *
 */
public abstract class Tray extends Item{

    protected Vector<Item> tray=new Vector<Item>();
    
    public Tray(String caption) {
        super(caption);
        // TODO Auto-generated constructor stub
    }
    
    public void add(Item item){
        tray.add(item);
    }

}

 

抽象產品:Page 類

  Page 類則是以抽象的方式表現整個HTML網頁的類。如果說LINK和TRAY是抽象零件,那麼Page 類就可以說是抽象的“產品”(負責最終輸出HTML)。Title字段是網頁的標題,author 是網頁的作者。最後以OutPut 輸出數據,代碼 :

 

/**
 * 以抽象的方式表現整個HTML網頁的類
 * 
 * @author Administrator
 * 
 */
public abstract class Page {

    protected String title;
    protected String author;
    protected Vector<Item> content=new Vector<Item>();

    public Page(String title, String author) {
        this.title = title;
        this.author = author;
    }
    
    
    
    public void add(Item item){
        content.add(item);
    }

    
    public String outPut(){
        StringBuffer sb=new StringBuffer();
        sb.append(title+".html\n");
        sb.append(makeHtml());
        return sb.toString();
        
    }
    
    public abstract String makeHtml();
}

 

  抽象產品參與 者規定由抽象工廠參與者所產生的抽象零件和產品的接口(API)。扮演這個參與者的是LINK類、Tray 類和Page 類。

 

 

抽象工廠:Factory 類

  該類包含一個getFactory 方法,利用參數Class<?>得到一個類的對象實例。

  在抽象工廠制作零件或產品時,會用到createLink、createTray、createPage這幾個方法。這些方法都是抽象方法,實際上的具體零件和產品制作過程則交給Factory 的子類來處理,方法是由這裡來規定。代碼 :

 

/**
 * 抽象工廠,在抽象工廠通過各個零件制作成產品
 * 
 * @author Administrator
 * 
 */
public abstract class Factory {

    public static Factory getFactory(Class<?> cls) {
        Factory factory = null;

        try {
            factory = (Factory) cls.newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return factory;
    }

    public abstract Link createLink(String caption, String url);

    public abstract Tray createTray(String caption);

    public abstract Page createPage(String title, String author);

}

  

  抽象工廠參與者則規定用來產生抽象產品參與者的對象實例的接口 (API),扮演這個角色的是Factory 類。

 

具體工廠:ListFactory 類

  該類實現Factory 類的抽象方法createLink 、createTray、createPage。這裡的實現工具調用 new 函數把ListLink 、ListTray 、ListPage 創建出來(可以利用之前寫過的Prototype 進行clone) 。代碼:
 

/**
 * 具體工廠
 * 
 * @author Administrator
 * 
 */
public class ListFactory extends Factory {

    @Override
    public Link createLink(String caption, String url) {
        // TODO Auto-generated method stub
        return new ListLink(caption, url);
    }

    @Override
    public Page createPage(String title, String author) {
        // TODO Auto-generated method stub
        return new ListPage(title, author);
    }

    @Override
    public Tray createTray(String caption) {
        // TODO Auto-generated method stub
        return new ListTray(caption);
    }

}

  

具體零件:ListLink 類

  該類為Link 的子類,負責實現Link 的makeHTML抽象方法。代碼:

 

public class ListLink extends Link {

    public ListLink(String caption, String url) {
        super(caption, url);
        // TODO Auto-generated constructor stub
    }

    @Override
    public String makeHTML() {
        // TODO Auto-generated method stub
        return " <li><a href=\"" + url + "\">" + caption + "</a></li>\n";
    }

}

 

具體零件:ListTray類

  該類為Tray 的子類,同上文一樣負責實現抽象類Tray 的makeHtml方法。代碼:

 

public class ListTray extends Tray {

    public ListTray(String caption) {
        super(caption);
        // TODO Auto-generated constructor stub
    }

    @Override
    public String makeHTML() {
        // TODO Auto-generated method stub
        StringBuffer sb = new StringBuffer();

        sb.append("<li>\n");
        sb.append(caption + "\n");
        sb.append("<ul>\n");
        Iterator<Item> it = tray.iterator();
        while (it.hasNext()) {
            Item item=(Item)it.next();
            sb.append(item.makeHTML());    //調用 ListLink實現完成後的makeHtml
        }
        sb.append("</ul>\n");
        sb.append("</li>\n");
        return sb.toString();
    }

}

 

抽象零件:ListPage類

   原理與上文相似,代碼:

 

public class ListPage extends Page {

    public ListPage(String title, String author) {
        super(title, author);
        // TODO Auto-generated constructor stub
    }

    @Override
    public String makeHtml() {
        // TODO Auto-generated method stub
        StringBuffer sb = new StringBuffer();
        sb.append("<html><head><title>" + title + "</title></head>\n");
        sb.append("<body>\n");
        sb.append("<h1>" + title + "<h1>\n");
        sb.append("<ul>\n");
        Iterator<Item> it=content.iterator();
        while(it.hasNext()){
            Item item=(Item)it.next();
            sb.append(item.makeHTML()); //調用 ListTray 實現完成 後的makeHTML
        }
        sb.append("</ul>\n");
        sb.append("<hr><address>"+author+"</address>");
        sb.append("</body></html>\n");
        
        return sb.toString();
    }

}

 

  具體產品參與者是實現抽象產品參與者的界面(API)。扮演這個角色分別為:ListLink 類、ListTray 類、ListPage類。

 

利用工廠把零件組合成產品:AbstractFactoryPatternActivity 類

  該類是界面UI展示入口,負責將抽象工廠的抽象零件和具體產品組裝打包,通過傳入創建的具體工廠,組裝具體產品。利用outPut 輸出。代碼:

public class AbstractFactoryPatternActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ((Button) findViewById(R.id.Button01))
                .setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Factory factory = Factory.getFactory(ListFactory.class);
                        Link cnblogs = factory.createLink("博客園",
                                "http://www.cnblogs.com/terryblog");

                        Link cto = factory.createLink("51CTO",
                                "http://terryblog.blog.51cto.com/");

                        Link csdn = factory.createLink("博客園",
                                "http://blog.csdn.net/terryyhl");

                        Tray cnblogsTray = factory.createTray("第一博客");
                        cnblogsTray.add(cnblogs);

                        Tray ctoTray = factory.createTray("第二博客");
                        ctoTray.add(cto);

                        Tray csdnTray = factory.createTray("第三博客");
                        csdnTray.add(csdn);

                        Page page = factory.createPage("my Blogs", "terry_龍");
                        page.add(cnblogsTray);
                        page.add(ctoTray);
                        page.add(csdnTray);

                        ((EditText) findViewById(R.id.EditText01)).setText(page
                                .outPut());

                    }
                });

    }
}

 

  客戶參與者是一個只使用抽象工廠參與者和抽象產品參與者的接口 (API)來完成 工作 的參與者。客戶參與者並不知道具體零件、產品或工廠。而上面的代碼就是負責做這件事。

 

運行結果:

 

源碼下載:

 抽象工廠模式

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved