单例模式(Singleton) 保证一个类仅有一个实例,并提供一个访问它全局访问点。
一般Singleton模式通常有几种种形式:
定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
第一种形式(饱汉模式)此模式实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间
public class Singleton {
private Singleton(){ } //注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式(饥汉模式):这个方法比上面有所改进,不用每次都进行生成对象,只是第一次,使用时生成实例,提高了空间效率!
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null)
instance=new Singleton();
return instance;
}
}
枚举(Enum) jdk1.5提供public enum SingleTon{
ONE;
}
享元模式(Flyweight) 用共享技术有效地支持大量细粒度的对象。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。采用这种设计模式可以避免大量相同的内容的开销这种开销中最常见、直观的就是内存的损耗。享元模式中区分了内蕴状态和外蕴状态;内蕴就是共性,外蕴就是个性。
三、结构
先从简单的入手,看看单纯享元模式的结构。
1) 抽象享元角色:为具体享元角色规定了必须实现的方法,而外蕴状态就是以参数的形式通过此方法传入。在Java中可以由抽象类、接口来担当。
2) 具体享元角色:实现抽象角色规定的方法。如果存在内蕴状态,就负责为内蕴状态提供存储空间。
3) 享元工厂角色:负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键!
4) 客户端角色:维护对所有享元对象的引用,而且还需要存储对应的外蕴状态。
来用类图来形象地表示出它们的关系吧:

string s1 = "abc";
string s2 = "abc";
Console.WriteLine(Object.ReferenceEquals(s1, s2));
输出的结果为True。说明只第一次创建了一个字符串对象s1,下次再创建相同的字符串s2时只是把它的引用指向s1所引用的具体对象,这就实现了相同字符串在内存中的共享。
工厂模式( Factory)主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。感觉有点像多态中的父类引用指向子类对象。我这里只介绍下我理解的简单工厂模式:
简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。
先来看看它的组成:
1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
