很久之前就阅读过GoF的设计模式,由于才疏学浅,又没有什么实践经验,完全是一个学生的走马观花。现在由于在实际工作中的需要,还是要一遍遍反复回味这些优秀的设计模式,正所谓温故而知新。
首先来说一说单例(Singleton)模式,我想这是非常容易理解的一种设计模式。所谓单例,就是要求在应用运行过程中,只存在某个类的一个实例,所有其它对象都只可能引用到这一个实例。为何要有单例模式,有一种说法是:节省内存。这个观点,不能说它是错误的,因为单例确实可以做到这一点,但这并不是单例模式出现的本因。我认为,单例模式是为了处理某些逻辑问题的。比如说,某个类,如果同时存在多个实例,就可能引发逻辑错误。比如一个计数类,负责对每一次web请求计数,假如多个实例同时出现,逻辑上就会发生错误。因为每一个实例都不能真实的反映访问量。
实现单例模式,也很简单,我们常见到的方式如下:
public class Singleton{
private static Singleton instance = null;
//一些其它数据域
private Singleton(){
}
public static Singleton getInstance(){
if(instance == null)
instance = new Singleton();
return instance;
}
}
这段代码的特殊之处:
1. 自己持有一个对自己引用的
静态数据域
2. 私有构造函数
3. 通过
静态getInstance()获得实例
正是由于以上的3点,才能保证单例不会被以new的方式得到,只能通过静态方法获得。
上面的这段代码,存在这一个隐患:
它并不是线程安全的,当面对一个并发访问的应用环境中时,有可能会出现2个实例。
比如,线程A执行到insta = new...时,此时,instance还没有得到真实的引用,此时线程B再次判断,发现instance仍是null,将会有一次创建新的实例。
下面我们将展示上述隐患:
public class Singleton {
private static Singleton instance = null;
private static int count=0;//记录被创建实例的总数
private int id;//当前实例的id
private Singleton(){
count++;
id = count;
}
public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
public int getId() {
return id;
}
}
简单的测试线程
public class TestThread implements Runnable {
public void run() {
// TODO Auto-generated method stub
Singleton myInstance = Singleton.getInstance();
System.out.println(myInstance.getId()+"th instance is created.");
}
}
Main函数:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThread threadA = new TestThread();
TestThread threadB = new TestThread();
new Thread(threadA).start();
new Thread(threadB).start();
}
}
结果:
在上述条件下,结果具有不确定性,与线程的调度有一定关系,所以,有时会创建一个实例,有时会创建两个实例:
1th instance is created.
1th instance is created.
-----------
2th instance is created.
1th instance is created.
-----------
1th instance is created.
2th instance is created.
下面,我们将getInstance方法声明成为synchronized的,运行结果始终是:
1th instance is created.
1th instance is created.
==================================================
享元模式 对于享元模式的认识,也是刚刚开始。享元来自于拳击术语,即轻量级(flyweight),意指面向对象程序设计中很多粒度很小的类。这些类具备这样的特点:它的某些属性或行为,与其它的类呈现包容关系。而且这些类的状态的变化,也是直接反映到所有包容它的类类中。就是说,这些类是可以被share的,所以称之为享元(共享的单元??)。
一个典型的例子,我觉得就是编辑器与文字的关系,26个英文字母,即可作为享元来使用。
那么,它会被哪些类共享呢?我们可以考虑由一个font类,那么,一个编辑器有很多种字体,字体有颜色 大小之类的属性,也有字母的值(a,b,c...),那么把这些字母的值和其固有的一些方法抽象出来作为享元。
也许你可能会觉得,不就是一个char的字符值么,有必要抽象成一个类么。但是,如果你有一个几百万个字母的文章需要处理,那么100w*sizeof(char)>>26*sizeof(char)+othercost的。
至于其它的应用场景,需要在现实应用中自己来思考抽象了。具体的实现也不再多谈,可以上网搜索。
分享到:
相关推荐
Java设计模式是软件开发中的重要概念,它们是解决常见问题的成熟、可重用的解决方案。在面试中,对设计模式的理解和应用能力是评估一个程序员技术水平的关键因素。以下是关于标题和描述中提及的一些主要设计模式的...
结构型设计模式包括适配器(Adapter)、桥接(Bridge)、装饰(Decorator)、外观(Facade)、享元(Flyweight)、组合(Composite)和代理(Proxy)。这些模式帮助我们更好地组织类和对象之间的关系,实现松耦合,...
本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
" JAVA 设计模式概述" JAVA 设计模式是指在软件设计过程中,为了提高代码的可维护性、灵活性和可扩展性所使用的一些惯用解决方案。JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建...
包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、组合模式(Composite)、享元模式(Flyweight)和代理模式(Proxy)。这些模式可以帮助我们更好地组织代码,实现...
结构型模式如适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)和代理(Proxy),主要关注如何组合不同的类和对象以实现新的功能。行为型模式如策略...
2. 结构型模式:关注对象组合和类的继承,例如适配器模式(Adapter)、装饰器模式(Decorator)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。...
结构型模式包括适配器(Adapter)、桥接(Bridge)、装饰(Decorator)、外观(Facade)、组合(Composite)、享元(Flyweight)和代理(Proxy),它们主要处理类与类之间的关系,帮助构建复杂的系统结构。...
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...
本资源“Java设计模式代码,设计模式系列所有示例代码”为学习者提供了实际操作设计模式的宝贵机会,使理论与实践相结合,提升开发效率和代码质量。 首先,设计模式分为三大类:创建型、结构型和行为型。创建型模式...
**JAVA设计模式** 在软件工程领域,设计模式是一种在特定情境下解决问题的可复用解决方案。它们是经验的总结,代表了在特定上下文中被广泛接受的、经过时间考验的最佳实践。Java设计模式是面向对象编程中的一种重要...
2. 结构型模式(Structural Patterns):如适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。...
例如适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、代理模式(Proxy)、组合模式(Composite)和享元模式(Flyweight)。 3. **行为型模式**:这类模式主要关注对象...
关注如何组合类和对象以形成更大的结构,例如适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。...
- **享元模式**(Flyweight Pattern) - **代理模式**(Proxy Pattern) - **行为型模式**:关注于算法与对象之间的分配,以及它们之间的通信机制。 - **策略模式**(Strategy Pattern) - **模板方法模式**...
2. 结构型模式:包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。这些模式关注如何将类或对象...
Java设计模式是软件工程中的一种最佳实践,它是一种在特定情境下解决常见问题的经验总结。设计模式并不是一种具体的代码或库,而是描述在各种不同情况下,如何设计和实现可复用、灵活、易于维护的软件组件。这些模式...