java有23中设计模式,Android中也用到了很多的设计模式,本篇就来介绍Android中常用的几种设计模式

一、普通工厂设计模式

普通工厂设计模式,就是创建一个工厂类负责创建对象 ,用户根据需求来从工厂类中获取自己想要的产品。这里涉及到的三个

词分别是:工厂 、产品和用户;这里要说明的是产品是有共同特征的,把共同特征提取出来生成一个接口,所有的产品都去实现这个接口

然后工厂类负责创建这些产品,用户需要什么产品去工厂类里获取;

代码实现如下:

产品共同特征接口

/**
* 产品共同特征接口
*
* @author jiaocg
*
*/
public interface MyProduct {
// 有什么共同特征都可以在这里定义
public void createProduct(String product);
}

苹果类

 public class Apple implements MyProduct {

     @Override
public void createProduct(String product) {
System.out.println("我是苹果");
} }

梨类

 public class Pear implements MyProduct {

     @Override
public void createProduct(String product) {
System.out.println("我是梨");
}
}

工厂类

 /**
* 工厂类
*
* @author jiaocg
*
*/
public class ProductFactory { public MyProduct getProduct(String puduct) {
if ("苹果".equals(puduct)) {
return new Apple();// 要苹果就返回苹果
}
return new Pear();// 要梨就返回梨
}
}

使用工厂类

 ProductFactory productFactory = new ProductFactory();
// 我想要苹果
MyProduct apple = productFactory.getProduct("苹果");
// 我想要梨
MyProduct pear = productFactory.getProduct("梨");

二、工厂方法设计模式

工厂方法设计模式是对普通工厂设计模式的拓展,普通工厂设计模式的缺点是,如果有新的产品出现,我们就要修改工厂类,去添加新的产品,

这样破坏了程序封闭性原则,而工厂方法设计模式则解决了这个问题。就是把工厂也独立出来,如上例说到的工厂类既可以创建苹果又可以创建梨

而工厂方法就是一个工厂类只负责创建一个产品(或多个已知产品),因此就生成了单独的工厂,如苹果工厂只生成苹果,梨工厂只生产梨,你添加了新的产品,我就创建新

的工厂类;由于工厂被独立出来,又拥有共同的特性,所以要提取出来一个接口,所有的工厂都去实现这个接口;这就是工厂方法设计模式;

代码示例如下:

苹果和梨对象还是上面的对象

我们首先提取工厂类接口

 /**
* 工厂类接口
*
* @author jiaocg
*
*/
public interface MyFactory { public MyProduct createProduct();
}

苹果工厂

 /**
* 苹果工厂
*
* @author jiaocg
*
*/
public class AppleFactory implements MyFactory { @Override
public MyProduct createProduct() {
return new Apple();
}

梨工厂

 /**
* 梨工厂
*
* @author jiaocg
*
*/
public class PearFactory implements MyFactory { @Override
public MyProduct createProduct() {
return new Pear();
}

使用工厂创建对象

 AppleFactory appleFactory=new AppleFactory();
// 我想要苹果
MyProduct apple = appleFactory.createProduct(); PearFactory pearFactory=new PearFactory();
// 我想要梨
MyProduct pear = pearFactory.createProduct();

以上就是简单的工厂方法设计模式,如果有新的产品出现,我们只需要去创建一个新的工厂类即可;

三、抽象工厂设计模式

有时候当产品种类很多的时候,我们只知道我们要这种产品,但是我们不确定要这种产品的哪一种。比如我们想要苹果

但是苹果有很多种类比如我们分为红苹果和青苹果,有红梨也有青梨,这时我们就可以根据产品的特点划分出产品的种类,

根据产品的种类来定义不同的工厂,我们把工厂共有的特性提取出一个抽象的工厂类,所有的工厂类都继承这个抽象的工厂类

然后来生产不同种类的产品;

代码示例如下:

首先是产品 提取出来一个抽象的产品类

 /**
* 抽象苹果类
*
* @author jiaocg
*
*/
public abstract class Apples { public abstract void createApple(); }

红苹果

 /**
* 抽象苹果的子类 红苹果
*
* @author jiaocg
*
*/
public class RedApple extends Apples { @Override
public void createApple() {
System.out.println("红苹果");
}
}

青苹果

 /**
* 抽象苹果的子类 青苹果
*
* @author jiaocg
*
*/
public class BlueApple extends Apples { @Override
public void createApple() {
System.out.println("青苹果");
} }

第二种产品

 /**
* 抽象梨
*
* @author jiaocg
*
*/
public abstract class Pears { public abstract void createPear();
}

红梨

 /**
* 抽象梨的子类 红梨
*
* @author jiaocg
*
*/
public class RedPear extends Pears { @Override
public void createPear() {
System.out.println("红梨");
} }

青梨

 /**
* 抽象梨的子类 青梨
*
* @author jiaocg
*
*/
public class BluePear extends Pears { @Override
public void createPear() {
System.out.println("青梨");
} }

然后我们提取出来一个抽象工厂

 /**
* 抽象工厂类
*
* @author jiaocg
*
*/
public abstract class FruitFactory { public abstract Apples createApples(); public abstract Pears createPears();
}

红色种类工厂

 /**
* 红色种类工厂
*
* @author jiaocg
*
*/
public class RedFactory extends FruitFactory { @Override
public Apples createApples() {
// 返回红苹果
return new RedApple();
} @Override
public Pears createPears() {
// 返回红梨
return new RedPear();
} }

青色种类工厂

 /**
* 青色种类生产工厂
*
* @author jiaocg
*
*/
public class BlueFactory extends FruitFactory { @Override
public Apples createApples() {
// 返回青苹果
return new BlueApple();
} @Override
public Pears createPears() {
// 返回青梨
return new BluePear();
} }

代码示例使用

 // 从红色种类工厂获取红色种类的水果
RedFactory redFactory = new RedFactory();
RedApple redApple = (RedApple) redFactory.createApples();
RedPear redPear = (RedPear) redFactory.createPears(); // 从青色种类工厂获取青色种类的水果
BlueFactory blueFactory = new BlueFactory();
BlueApple blueApple = (BlueApple) blueFactory.createApples();
BluePear bluePear = (BluePear) blueFactory.createPears();

这样我们就可以对产品进行分类,并创建对应的工厂,我们不知道要什么产品不重要,我们所有种类的工厂

都有,你想要什么种类的产品就创建什么样的工厂,我都能给你。

抽象工厂设计模式的关键在于 抽象产品和抽象工厂类,把所有的产品和工厂进行对应的分类才是关键。

Android常用设计模式(一)的更多相关文章

  1. Android常用设计模式(二)

    Android常用设计模式之观察者模式 观察者设计模式在Android应用中会经常用到,模式原理类似于这样的场景: 用户订报纸,然后在报社登记,报社来统计用户(添加用户),用户也可以取消订阅,报社删除 ...

  2. Android 常用开发工具以及Mac常用软件

    Android 常用的开发工具记录.其中包括AndroidStudio(IDEA)插件.Mac 上好用的软件以及国内知名Android开发者博客等. Android Studio 插件 codota ...

  3. Android 常用数据适配器SimpleAdapter

    在<Android 常用数据适配器ArrayAdapter>中介绍了ArrayAdapter数据适配器.但是存在一个缺陷,那就是条目的图标都固定相同,要显示每个条目的图标都不相同,那么使用 ...

  4. 代码重构 & 常用设计模式

    代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ...

  5. IOS开发常用设计模式

    IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...

  6. Android 常用 adb 命令

    查看原文:http://blog.csdn.net/u010818425/article/details/52266593 (一)基础操作 安装app adb install -r xxx.apk / ...

  7. 【风马一族_Android】第4章Android常用基本控件

    第4章Android常用基本控件 控件是Android用户界面中的一个个组成元素,在介绍它们之前,读者必须了解所有控件的父类View(视图),它好比一个盛放控件的容器. 4.1View类概述 对于一个 ...

  8. Android常用组件

    UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...

  9. Android常用组件【转】

    UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...

随机推荐

  1. form表单action提交表单,页面不跳转且表单数据含文件的处理方法

    在最近的项目中需要将含 input[type='file']的表单提交给后台 ,并且后台需要将文件存储在数据库中.之前所用的方法都是先将文件上传到七牛服务器上,然后七牛会返回文件的下载地址,在提交表单 ...

  2. Linux的段错误调试方法

    linux段错误的调试方法 相关博文: http://blog.csdn.net/htianlong/article/details/7439030 http://www.cnblogs.com/pa ...

  3. HMM 自学教程(八)总结

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在HMM 学习最佳范例,这是针对国外网站上一个 HMM 教程的翻译,作者功底很深,翻译得很精彩,且在 ...

  4. AngularJS 五大特性,加快 Web 应用开发

    AngularJS 是谷歌的一个 JavaScript 框架,旨在简化前端应用程序的开发.如果你在开发单页的应用程序,我敢肯定你已经听说过它.我是 AngularJS 的忠实粉丝,在这篇文章中我将概述 ...

  5. JS魔法堂:追忆那些原始的选择器

    一.前言                                                                                                 ...

  6. 【第三课】ANR和OOM——贪快和贪多的后果(下)

    Out of Mana,法力耗尽. 内存就像法力,耗尽了就什么都不能做了.有时候一个应用程序占用了太大的内存,超过了Android系统为你规定的限制,那么系统就会干掉你,以保证其他app有足够的内存. ...

  7. C#开发ActiveX网页截图控件

    故事背景:Java组的小伙伴需要一个能在IE(还是6...)下截图并返回给网页的功能,但是IE做起来很麻烦(可能根本做不到),于是找到我写一个ActiveX控件实现此功能,想着可能还有其他小伙伴需要这 ...

  8. EasyUI组合树插件

    一.引用CSS和JS <link href="~js/easyui/easyui.css" rel="stylesheet" type="tex ...

  9. 推荐使用C++ 11

    如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11.当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的.我在下面给出了9个理由,它们分为 ...

  10. DotNetCore跨平台~性能测试~可以放心使用了

    使用dotnetCore发布站点后,它的处理请求能力不逊色IIS等大型服务的能力,号称每秒能处理115万个请求,太牛X了也. 先看看它支持的数据库 以下主流数据库都是为支持的 Microsoft SQ ...