单例模式和工厂方法模式

单例模式的定义

单例模式(Singleton Pattern)是一个比较简单的模式,其定义如下:

Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)

单例模式通用代码

public class Singleton {

private static final Singleton singleton = new Singleton();

//限制产生多个对象

private Singleton(){

}

//通过该方法获得实例对象

public static Singleton getSingleton(){

return singleton;

}

//类中其他方法,尽量是static

public static void doSomething(){

HuDun Demo

}

}

单例模式的优点

● 由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地

创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。

● 由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要

比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一

个单例对象,然后用永久驻留内存的方式来解决(在Java EE中采用单例模式时需要注意JVM

垃圾回收机制)。

● 单例模式可以避免对资源的多重占用。

● 单例模式可以在系统设置全局的访问点,优化和共享资源访问。

单例模式的缺点

● 单例模式一般没有接口,扩展很困难。

● 单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行

测试的,没有接口也不能使用mock的方式虚拟一个对象。

● 单例模式与单一职责原则有冲突。

单例模式的使用场景

在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反

应”,可以采用单例模式,具体的场景如下:

● 要求生成唯一序列号的环境;

● 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以

不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;

● 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源;

● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当

然,也可以直接声明为static的方式)。

单例模式的注意事项

首先,在高并发情况下,请注意单例模式的线程同步问题。

其次,需要考虑对象的复制情况。在Java中,对象默认是不可以被复制的,若实现了

Cloneable接口,并实现了clone方法,则可以直接通过对象复制方式创建一个新对象,对象

复制是不用调用类的构造函数,因此即使是私有的构造函数,对象仍然可以被复制。

注意:

需要产生固定数量对象的模式就叫做有上限的多例模式,它是单例模式的一种扩

展,采用有上限的多例模式,我们可以在设计时决定在内存中有多少个实例,方便系统进行

扩展,修正单例可能存在的性能问题,提供系统的响应速度。

工厂方法模式的定义

工厂方法模式使用的频率非常高,在我们日常的开发中总能见到它的身影。其定义为:

Define an interface for creating an object,but let subclasses decide which class to

instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)

工厂方法模式的优点

首先,良好的封装性,代码结构清晰。

其次,工厂方法模式的扩展性非常优秀。

最后,工厂方法模式是典型的解耦框架。

工厂方法模式的使用场景

首先,工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用。

其次,需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。

再次,工厂方法模式可以用在异构项目中。

最后,可以使用在测试驱动开发的框架下。

工厂方法模式的扩展

1. 缩小为简单工厂模式

简单工厂模式(Simple Factory Pattern),也叫做

静态工厂模式。在实际项目中,采用该方法的案例还是比较多的,其缺点是工厂类的扩展比

较困难,不符合开闭原则,但它仍然是一个非常实用的设计模式。

2. 升级为多个工厂类

3. 替代单例模式

单例模式的核心要求就是在内存中只有一个对象,通过工厂方法模式也可以只在内存中生产一个对象。

4. 延迟初始化

何为延迟初始化(Lazy initialization)?一个对象被消费完毕后,并不立刻释放,工厂类

保持其初始状态,等待再次被使用。延迟初始化是工厂方法模式的一个扩展应用。

延迟加载的工厂类

public class ProductFactory {

private static final Map<String,Product> prMap = new HashMap();

public static synchronized  Product createProduct(String type) throws Exception{

Product product =null;

//如果Map中已经有这个对象

if(prMap.containsKey(type)){

product = prMap.get(type);

}else{

if(type.equals("Product1")){

product = new ConcreteProduct1();

}else{

product = new ConcreteProduct2();

HuDun Demo

}

//同时把对象放到缓存容器中

prMap.put(type,product);

}

return product;

}

}

代码还比较简单,通过定义一个Map容器,容纳所有产生的对象,如果在Map容器中已

经有的对象,则直接取出返回;如果没有,则根据需要的类型产生一个对象并放入到Map容

器中,以方便下次调用。

时间: 2024-10-07 05:31:28

单例模式和工厂方法模式的相关文章

PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式

1.单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 要实现每一个类只有一个实例,就需要对实例化进行限制. 单例模式实现要点: ① 构造函数私有化,不允许使用new关键字创建对象  ② 对外提供获取对象的方法.在方法中判断对象是否为空,如果为空则创建对象并返回,如果不为空则直接返回  ③ 实例对象的属性以及获取对象的方法必须是静态的  ④ 之后,创建对象只能使用我们提供的静态方法. 

创建型模式 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

说起模式来大家都很头疼.大篇的介绍和概念,还有类图.. 一 简单工厂模式不属于23中涉及模式,简单工厂一般分为:普通简单工厂.多方法简单工厂.静态方法简单工厂. 简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 普通简单工厂  多方法简单工厂 静态方法简单工厂 class SimpleFacto

Factory Method 工厂方法模式

Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.” 创建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中.创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级别的抽象,还可能并不是复合对象概念的一部分.工厂方法模式通

设计模式(二)---工厂方法模式

project方法模式 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 我的理解:工厂方法模式不是通过newkeyword来创建对象的.而是通过工厂接口提供的方法来创建其它对象. 工厂设计模式,在开发过程中非经常见,以下使用一个样例来引入普遍的工厂设计模式. 一个加工厂商加工不同的产品. Product类.抽象类,表示不同的产品. FoodProduct类,继承Product类,并实现其抽象方法. FruitProduct类,继承Product

设计模式之第1章-工厂方法模式(Java实现)

设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~).“抽象工厂模式,赶紧的自我介绍,工厂方法模式,你身为男人,要懂得绅士风度,lady first懂不懂,稍后再来,急什么.”(画外音:鱼哥,这是我家祖传的小吃,还有我爹的好酒blablabla),“哎呀,那个抽象工厂模式,阿姨喊你回家吃饭了.”“哦,我去去就回,等我啊.”工厂方法,赶紧的.“等等,

php设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——工厂方法模式(Factory Method) 4 */ 5 6 7 /* 8 * IAp

Android设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

C#设计模式——工厂方法模式

一.引言 在简单工厂中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的. 二.工厂方法模式的实现 工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的

工厂方法模式

开放-封闭原则: 在设计模式中,对于不能修改,但可以扩展的思想也是一种重要的设计原则.比如国家对于香港的一国两制.大陆的社会主义是不可以更改的,但由于香港长期处于资本主义下,强制执行社会主义难免有些牵强,所以邓小平同志就用了开放-封闭原则,完美的解决了这一问题.在前期进行软件设计的时候,应该做好后期新增需求的准备.尽量做到新增需求时,不需要更改已有代码,而是新增代码,进行需求的扩展. 工厂方法模式: 问题抛出:在上一篇文章中,通过一个简单的两位数计算介绍了简单工厂模式.在这基础上,试想如果我们需