Android Ap 开发 设计模式第八篇:抽象工厂模式

简介:

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)来完成 工作 的参与者。客户参与者并不知道具体零件、产品或工厂。而上面的代码就是负责做这件事。

 

运行结果:

 

源码下载:

 抽象工厂模式

 

  再发个求职信息:

  求职android(可胜任Framework及 以上工作。一年半经验) 、Windows Phone 7(软件、XNA) 开发工作。





 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/623131,如需转载请自行联系原作者


相关文章
|
1月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
55 19
|
1月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
61 14
|
1月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
1月前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
在数字时代,掌握安卓应用开发技能是进入IT行业的关键。本文将引导读者从零基础开始,逐步深入安卓开发的世界,通过实际案例和代码示例,展示如何构建自己的第一个安卓应用。我们将探讨基本概念、开发工具设置、用户界面设计、数据处理以及发布应用的全过程。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上迈出坚实的步伐。
34 5
|
1月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
1月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
1月前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
1月前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
38 0
|
1月前
|
存储 监控 Java
探索安卓开发:从基础到进阶的旅程
在这个数字时代,移动应用已成为我们日常生活的一部分。对于开发者来说,掌握安卓开发不仅是技能的提升,更是通往创新世界的钥匙。本文将带你了解安卓开发的核心概念,从搭建开发环境到实现复杂功能,逐步深入安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的见解和技巧,帮助你在安卓开发的道路上更进一步。
28 0