单例模式

简单的来说,单例模式就是提供一个实例,并且提供一个全局的访问点。

适用场景:1.应用中某个实例对象需要频繁的被访问。

2.应用中每次启动只会存在一个实例。

优点:内存中只有一个实例,减少了内存的开销,避免对资源的多重占用。

常用的三种方式:

(1)懒汉式

public class  A{

/* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */

private static A instance = null;

/* 私有构造方法,防止被实例化 */

private A(){

}

/* 1:懒汉式,静态工程方法,创建实例 */

public static A getInstance(){

if(instance == null){

instance = new A()

}

return instance;

}

}

调用:

[java] view plain copy  
  1. Singleton.getInstance().method();

优点:延迟加载(需要时在加载)

缺点:线程不安全,在多线程中很容易出现不同步的情况

(2)加同步锁

既然线程不安全,那就加上同步锁,一种加法如下:

[java] view plain copy  
  1. /*2.懒汉式变种,解决线程安全问题**/
  2. public static synchronized Singleton getInstance() {
  3. if (instance == null) {
  4. instance = new Singleton();
  5. }
  6. return instance;
  7. }

(3)内部类的实现

内部类是一种好的实现方式,可以推荐使用一下:

[java] view plain copy  
  1. public class SingletonInner {
  2. /**
  3. * 内部类实现单例模式
  4. * 延迟加载,减少内存开销
  5. *
  6. * @author xuzhaohu
  7. *
  8. */
  9. private static class SingletonHolder {
  10. private static SingletonInner instance = new SingletonInner();
  11. }
  12. /**
  13. * 私有的构造函数
  14. */
  15. private SingletonInner() {
  16. }
  17. public static SingletonInner getInstance() {
  18. return SingletonHolder.instance;
  19. }
  20. protected void method() {
  21. System.out.println("SingletonInner");
  22. }
  23. }

调用:

[java] view plain copy  
  1. SingletonInner.getInstance().method();

优点:延迟加载,线程安全(java中class加载时互斥的),也减少了内存消耗

工厂模式

简单来说就是给外部批量提供相同或者不同的产品,而外部不需要关心工厂是如何创建一个复杂产品的过程。所以工厂模式降低模块间的耦合,同时提高扩展性。

(1)标准工厂模式

首先先介绍一下标准的工厂方法模式,不带任何的变种.以工厂生产不同操作系统的手机为例.

建立一个产品接口,提供一个获取系统信息的方法.

[java] view plain copy
  1. /**
  2. * Created by jesse on 15-8-17.
  3. */
  4. public interface IPhone {
  5. public void getOS();
  6. }

再根据IPhone接口实现Android,IOS,Blackberry三种手机.

[java] view plain copy
  1. public class AndroidPhone implements IPhone {
  2. private final String TAG = AndroidPhone.class.getSimpleName();
  3. @Override
  4. public void getOS() {
  5. Log.i(TAG, "im Android");
  6. }
  7. }
  8. public class IosPhone implements IPhone {
  9. private final String TAG = IosPhone.class.getSimpleName();
  10. @Override
  11. public void getOS() {
  12. Log.i(TAG, "im IOS");
  13. }
  14. }
  15. public class BlackBerryPhone implements IPhone {
  16. private final String TAG = BlackBerryPhone.class.getSimpleName();
  17. @Override
  18. public void getOS() {
  19. Log.i(TAG, "im BlackBerry");
  20. }
  21. }

标准的工厂方法模式都需要有抽象的工厂接口或者基类.

[java] view plain copy
  1. public abstract class IGenerator {
  2. public abstract IPhone generatePhone(String flag) throws Exception;
  3. }

通过基类或者接口来实现真实的工厂类,这里需要注意跟简单工厂模式的不同,标准的工厂方法模式里面一个工厂只生产一个产品,所以这里要根据产品的种类划分出来三个工厂,分别生产三种不同的产品.这种设计思想非常契合单一职责原则.

[java] view plain copy
  1. public class AndroidGenerator extends IGenerator {
  2. @Override
  3. public IPhone generatePhone() {
  4. return new AndroidPhone();
  5. }
  6. }
  7. public class IOSGenerator extends IGenerator {
  8. @Override
  9. public IPhone generatePhone() {
  10. return new IosPhone();
  11. }
  12. }
  13. public class BlackberryGenerator extends IGenerator {
  14. @Override
  15. public IPhone generatePhone() {
  16. return new BlackBerryPhone();
  17. }
  18. }

在客户端从工厂中获得产品并使用的过程中都是通过接口进行访问的,在创建产品的阶段有效得降低了使用者和产品之间的耦合度.

[java] view plain copy
  1. IPhone android, ios, bb;
  2. IGenerator androidGenerator, iosGenerator, bbGenerator;
  3. androidGenerator = new AndroidGenerator();
  4. iosGenerator = new IOSGenerator();
  5. bbGenerator = new BlackberryGenerator();
  6. android = androidGenerator.generatePhone();
  7. ios = iosGenerator.generatePhone();
  8. bb = bbGenerator.generatePhone();
  9. android.getOS();
  10. ios.getOS();
  11. bb.getOS();

(2)简单工厂模式,也称为静态工厂方法模式。它不能通过继承进行扩展,如果有新增的产品,就只能在静态方法里面做修改。

因为这是静态工厂方法模式,所以工厂类就没有接口或者虚基类来提供抽象.通过不同的Flag来初始化不同的产品.

[java] view plain copy
  1. public class PhoneGenerator{
  2. public final static String GENERATE_IOS = "generate_ios";
  3. public final static String GENERATE_ANDROID = "generate_android";
  4. public final static String GENERATE_BLACKBERRY = "generate_blackberry";
  5. public static IPhone generatePhone(String flag) throws Exception {
  6. IPhone iPhone = null;
  7. switch (flag){
  8. case GENERATE_ANDROID:
  9. iPhone =  new AndroidPhone();
  10. break;
  11. case GENERATE_IOS:
  12. iPhone =  new IosPhone();
  13. break;
  14. case GENERATE_BLACKBERRY:
  15. iPhone =  new BlackBerryPhone();
  16. break;
  17. default:
  18. throw new Exception("UNDEFINED FLAG");
  19. }
  20. return iPhone;
  21. }
  22. }

对外部来说要使用工厂只需要把目标产品类传过去就行了.运行结果跟1)中的是一样的.

[java] view plain copy
  1. IPhone android, ios, bb;
  2. android = PhoneGenerator.generatePhone(PhoneGenerator.GENERATE_ANDROID);
  3. ios = PhoneGenerator.generatePhone(PhoneGenerator.GENERATE_IOS);
  4. bb = PhoneGenerator.generatePhone(PhoneGenerator.GENERATE_BLACKBERRY);
  5. android.getOS();
  6. ios.getOS();
  7. bb.getOS();

安卓中的单例模式和工厂模式相关推荐

  1. 软件设计模式“单例模式”和“工厂模式”

    软件设计模式"单例模式"和"工厂模式" 单例模式 什么是单例模式 单例模式的实现方式有哪些 单例模式的优缺点 单例模式的应用场景 总结 工厂模式 什么是工厂模式 ...

  2. 创建型模式-单例模式、工厂模式

    目录 创建型模式特点 创建型模式分类 1.单例模式(Singleton Pattern) 单例介绍 代码演示 ①饿汉式(静态常量) ②饿汉式(静态代码块) ③懒汉式(线程不安全) ④懒汉式(线程安全, ...

  3. 设计模式——单例模式、工厂模式

    设计模式--单例模式.工厂模式 一.六大设计原则 开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热 ...

  4. 常用设计模式总结(单例模式,工厂模式,代理模式)

    常用设计模式总结(未完待续) 单例模式 单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法.单例模 ...

  5. 一口气讲完设计模式(单例模式、工厂模式、原型模式、建造者模式、适配器、桥梁模式)

    设计模式 使用设计模式,可以让我们的代码具有更好的可读性.可扩展性.可读性.重用性.符合高内聚低耦合的特点.作为程序员,是我们经常听到的概念,也是我们程序员必须深入学习,了解的知识. 设计模式种类 该 ...

  6. 用最简单的例子说明设计模式(一)之单例模式、工厂模式、装饰模式、外观模式...

    设计模式 所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案).使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.设计模式使人们可以更加简单 ...

  7. 基本设计模式:单例模式和工厂模式代码实现

    单例模式 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点.通常我们可以让一个全局变量使得一个对象被访问,但它不能阻止你实例化多个对象.一个最好的办法是,让类自身负责保存它的唯一实例.这个 ...

  8. JAVA常用设计模式(一、单例模式、工厂模式)

    JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map;/*** 设计模式之单例模式* 单例模式(Singleton Pattern) ...

  9. iOS-事件响应链、单例模式、工厂模式、观察者模式

    欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary 一.iOS中事件传递和相应机制 iOS中 ...

最新文章

  1. 脑智前沿科普|虚拟现实如何欺骗你的大脑
  2. Android 多线程之可以重复启动与停止的服务
  3. python获取android手机信息
  4. 科大星云诗社动态20210304
  5. ups容量计算和配置方法_干货:UPS电源配蓄电池公式计算方法!
  6. IDC:全球经济危机为云计算带来曙光
  7. Tautology(poj3295)(DFS)
  8. matlab radsimp,[转载]MATLAB学习笔记(八)
  9. c# msi中加入驱动_MSI微星:给你的CPU装上热交换气缸活塞,不用电也能驱动风扇降温...
  10. ai医疗行业研究_我作为AI医疗保健研究员的第一个月
  11. 手把手教做无人驾驶算法(二十六)--基于终端约束的MPC 控制
  12. oracle怎么该字体,oracle中修改国家字符集(转)
  13. 记一次编写刷浏览量,刷查看次数脚本(内附代码)
  14. 英文连写字体怎么练_漂亮的英语字体是这样练成的!!
  15. 华科计算机学院专业课,华中科技大学计算机专业课程表.xls
  16. VMware安装_CentOS 7.x系统
  17. 商品表设计-实现侧滑栏类目Catagory和商品的多对多关系
  18. 在线微信对话生成器源码 装逼神器
  19. 2017南京大学计算机考研复试分,2018.的南大复试考生,:2017南京大学中国古代史考研复试经...
  20. java获取中文的拼音以及获取中文拼音的首字母

热门文章

  1. ubuntu多节点安装kubernetes
  2. NAPTR和SRV记录
  3. ubuntu 编译安装php mysql_ubuntu编译安装php5 mysql nginx
  4. active英语怎么读音_必须收藏!英语48个音标发音(附详细图解+视频教程)
  5. 密度泛函DFT与神经网络
  6. 10个linux awk文本处理经典案例,关于AWK的10个经典案例
  7. c mysql insert语句_MySQL_mysql insert详细讲解,INSERT语法 INSERT [LOW_PRIORITY |DELA - phpStudy...
  8. python输入输出简单例子_Python 文件和流的简单示例
  9. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第11章-基于邻居相关状态的多智能体非合作行为检测与隔离
  10. 2.10 m 个样本的梯度下降-深度学习-Stanford吴恩达教授