http://www.cnblogs.com/pengmengnan/p/6717766.html

一 : 工厂模式
工厂模式主要是为创建对象提供过度接口,以便将创建对象的具体 
过程屏蔽隔离起来,达到提高灵活性的目的.
工厂模式可以分为三类 : 
(1)简单工厂模式(simple factory)
(2)工厂方法模式 (factory method)
(3)抽象工厂模式(abstract factory)
( 一 ): 简单工厂模式
又称为静态工厂方法模式用来生产统一登记结构中任意产品,通过 
建立一个工厂(一个函数或一个类方法)来制造新的对象.
模式组成结构 : 
抽象产品:他一般视具体产品继承的父类或实现的接口.在java代 
码中由接口或者抽象类来实现.
具体产品: 工厂类所创建的对象就是此角色的实例.在java中有一 
个具体类来实现.
工厂类 : 这是本模式的核心,含有一定的商业逻辑和判断逻辑.在 
java中它往往由一个具体类实现.
示例代码:
抽象产品:
public interface Car{
void run();
}
具体产品 : 
public class Audi implements Car {
public void run(){
System.out.println("奥迪车");
}
}
public class BenChi implements Car{
public void run(){
System.out.println("奔驰");
}
}
工厂类 :
public class SimpleFactory{
public Car createrCar(String type){
if("奥迪".equals(type)){
return new Audi();
}else if("奔驰".equals(type)){
return new BenChi ();
}else {
return null;
}
}
}
客户类(测试类) :
public class Customer {
public static void main(String [] args ) {
SimpleFactory factory = new SimpleFactory ();
Car car1 = factory .createrCar("奥迪");
Ca r car2 = factory .createrCar("奔驰");
}
}

这边是简单的工厂模式,但是工厂部分不太理想,因为每增加一种新 
车型,都要在工厂中增加相应的创建业务逻辑,这显然是违背开闭原 
则的.可想而知对于新的产品的加入,工厂类很是被动.
于是工厂方法模式出现了,工厂类定义成了接口,而每新增的车型种 
类,就增加该车种类对应的工厂类的实现,这样工厂的设计就可以拓 
展了,而不必去修改源代码.
(二) : 工厂方法模式
工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模 
式里不在只由一个工厂类决定哪一个产品被实例化,这个决定交给 
抽象工厂的子类去做.
模式组成结构 : 
抽象产品: 他一般视具体产品集成的父类或者实现的接口.在java 
中有接口或者抽象类来实现.
具体产品 : 工厂类所创建的对象就是此角色的实例..在java中有 
一个具体类实现.
抽象工厂 : 这是工厂方法模式的核心,它与应用程序无关.是具体 
工厂角色实现的接口或者必须继承的父类.在java由接口或者抽象 
类来实现.
具体工厂 : 它含有和具体业务逻辑有关的代码.有应用程序调用 
以创建对应的具体产品的对象.
示例代码 : 
抽象产品:
public interface Car{
void run();
}
具体产品 : 
public class Audi implements Car {
public void run(){
System.out.println("奥迪车");
}
}
public class BenChi implements Car{
public void run(){
System.out.println("奔驰");
}
}

抽象工厂 : 
public interface CarFactory{
Car createCar();
}

具体工厂:
public class AuiFactory implements CarFactory{
publuic Car createCar(){
return new Audi();
}
}
public class BenChiFactory implements CarFactory{
publuic Car createCar(){
return new BenChi();
}
}
客户类:
public class Customer {
public static void main(String [] args ) {
Car car1 = new AuiFactory .createCar();
Car car2 = new .BenChiFactory .createCar();
}
}
简单工厂模式VS工厂方法模式
(1)结构复杂度:简单工厂模式更简单
(2)代码复杂度 : 简单工厂模式更少
(3)管理难度: 工厂方法模式的核心是一个抽象工厂类,而不是简单 
工厂模式,把核心放在一个类上拓展性更好,易于管理
根据设计理念建议使用工厂方法模式,但是实际上,我们一般使用简 
单工厂模式.
(三)抽象工厂模式:
抽象工厂模式提供一个创建一系列相关或相依赖对象的接口,而无 
需指定他们的具体的类.他针对的是有多个产品的等级结构.

反射机制

根据上面的工厂模式可以看出,根据需求要写出不同的对象实例化 
的方法,因此,spring引用了反射的思想:
根据类名可以找到其对应的类然后实例化对象,返回一个Object的 
类.
示例代码 : 
工厂类 :
public static Object getBean(String n){
if(n!=null&&!"".equals(n)){
try {
return 
Class.forName(n).newInstance(); // 通过类名 反射 实例化 
对象
} catch 
(InstantiationException e) {

e.printStackTrace();
} catch 
(IllegalAccessException e) {

e.printStackTrace();
} catch 
(ClassNotFoundException e) {

e.printStackTrace();
}
}
return null;

}

客户类:
IdCard u = (IdCard)Factory.getBean 
("com.jk.pojo.IdCard");
因为返回的是一个Object所以要强转
二 : 单例模式
一 : 饿汉模式 
特点:
在类装载的时候就初始化Singleton,有时候不是调用getInstance 
方法,调用别的静态方法,也会让类进行静态加载,但是,此时并不一 
定想实例化Singleton,造成资源的浪费.
这种方式基于classloder机制避免了多线程的同步问题,不过, 
instance在类装载时就实例化,虽然导致类装载的原因有很多种, 
在单例模式中大多数都是调用getInstance方法, 但是也不能确 
定有其他的方式(或者其他的静态方法)导致类装载,这时候初始 
化instance显然没有达到lazy loading的效果。
代码示例:
1. public class Singleton { 
2. private static Singleton instance = new 
Singleton(); 
3. private Singleton (){} //私有化有参构造
4. public static Singleton getInstance() { 
5. return instance; 
6. } 
7. }

二:饿汉模式变种
表面上看起来差别挺大,其实更第三种方式差不多,都是在类初始 
化即实例化instance。只是将实例化的对象放到了静态代码块中
示例代码:
1. public class Singleton { 
2. private Singleto+n instance = null; 
3. static { 
4. instance = new Singleton(); 
5. } 
6. private Singleton (){} 
7. public static Singleton getInstance() { 
8. return this.instance;
9. } 
10. } 
三 : 懒汉模式(线程安全的)
(1)
特点 : 没有加ysnchronized的懒汉模式,是线程不安全的,比如说 
一个线程来了判断instance是null,就去实例化Singleton了,在实 
例化之前,这是另一个线程来判断这个instance,发现也是null所 
以又去实例化一次,所以严格上来说不加synchronized懒汉模式, 
不是单例模式.synchronized 是让访问的客户自动去排队因此即 
使前面已经判断过不为空了,但后面的访问还是要一个一个的去排 
队访问,所以效率低
示例代码:
1. public class Singleton { 
2. private static Singleton instance; 
3. private Singleton (){} 
4. public static synchronized Singleton 
getInstance() { 
5. if (instance == null) { 
6. instance = new Singleton(); 
7. } 
8. return instance; 
9. } 
10. } 
(2)双重校验锁(重点)
加了双重校验锁的懒汉模式既可以使线程安全又不会影响效率,因 
为,第一次排队实例化第一个对象之后,下面在有访问的就直接被第 
一个if拦截住了,所以不需要去排队访问
示例代码
public class Singleton {
private Singleton(){};//私有化构造器
private static volatile Singleton instance = null; 
// volatile 不稳定
public static Singleton getInstance(){ // 
synchronized 同步锁 线程锁
if(instance==null){ // 双重判定锁 
synchronized (Singleton.class){
if(instance ==null){
instance = new Singleton ();
}
}
}
return instance ;
}
}
四 : 懒汉式(线程不安全)
这种写法lazy loading很明显,但是致命的是在多线程不能正常 
工作。比如说一个线程来了判断instance是null,就去实例化 
Singleton了,在实例化之前,这是另一个线程来判断这个 
instance,发现也是null所以又去实例化一次,所以严格上来说不 
加synchronized懒汉模式,不是单例模式.
1. public class Singleton { 
2. private static Singleton instance; 
3. private Singleton (){} 
4. 
5. public static Singleton getInstance() { 
6. if (instance == null) { 
7. instance = new Singleton(); 
8. } 
9. return instance; 
10. } 
11. }
五 : (静态内部类)
1. public class Singleton { 
2. private static class SingletonHolder { 
3. private static final Singleton INSTANCE = new 
Singleton(); 
4. } 
5. private Singleton (){} 
6. public static final Singleton getInstance() { 

7. return SingletonHolder.INSTANCE; 
8. } 
9. } 
这种方式同样利用了classloder的机制来保证初始化 
instance时只有一个线程,它跟第三种和第四种方式不同的是(很 
细微的差别):第三种和第四种方式是只要Singleton类被装载了 
,那么instance就会被实例化(没有达到lazy loading效果), 
而这种方式是Singleton类被装载了,instance不一定被初始化。 
因为SingletonHolder类没有被主动使用,只有显示通过调用 
getInstance方法时,才会显示装载SingletonHolder类,从而实 
例化instance。想象一下,如果实例化instance很消耗资源,我 
想让他延迟加载,另外一方面,我不希望在Singleton类加载时就 
实例化,因为我不能确保Singleton类还可能在其他的地方被主动 
使用从而被加载,那么这个时候实例化instance显然是不合适的。 
这个时候,这种方式相比第三和第四种方式就显得很合理
六 : 枚举
1. public enum Singleton { 
2. INSTANCE; 
3. public void whateverMethod() { 
4. } 
5. } 
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅 
能避免多线程同步问题,而且还能防止反序列化重新创建新的对象 
,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum 
特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少 
看见有人这么写过

spring中用到的设计模式的更多相关文章

  1. Spring中用了哪些设计模式

    1 简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. ...

  2. spring中用到哪些设计模式?

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话 ...

  3. 【Spring】Spring中用到的设计模式

    1.简单工厂 又叫静态工厂方法模式,不属于23种设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. Spring中的BeanFactory就是简单工厂模式的 ...

  4. 了解一下Spring中用了哪些设计模式?这样回答面试官才稳

    一:简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. ...

  5. 设计模式 | Spring中用到的设计模式,你知道几个?

    设计模式无处不在,因为它就来自于我们的日常生活,提炼于生活经验. 正握在你手中的手机,不能用220V的电压直接充电,需要一个专门的电源适配器(充电器)才行.摆在你桌上的电脑也是一样的,都需要" ...

  6. spring中用到哪些设计模式

    1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了: 2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationCon ...

  7. 深入解析spring中用到的九种设计模式

    转载请注明出处,文章首发于:http://itxxz.com/a/javashili/tuozhan/2014/0601/7.html 设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也 ...

  8. spring中用到了哪些设计模式

    spring中用到了哪些设计模式?(顺丰) spring中常用的设计模式达到九种,我们举例说明: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种G ...

  9. Spring中用到了哪些设计模式?

    谈谈Spring中都用到了哪些设计模式? JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见.我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是 ...

随机推荐

  1. chattr 命令详解

    chattr   作用: 改变文件属性,这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有一下8种模式 模式: a: 让文件或目录仅供附加用途 b: 不更新文件或目录的最后存取时间 ...

  2. Linux根目录详解-转自鸟哥的私房菜

    转自:http://myhat.blog.51cto.com/391263/107931/   *根目录(/)的意义与内容: 根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的 ...

  3. 阅读MDN文档之StylingBoxes(五)

    目录 BoxModelRecap Box properties Overflow Background clip Background origin Outline Advanced box prop ...

  4. Angularjs 2 绝对零基础的教程(1):从安装配置开始

    写在前面 适合人群: 1. 愿意未来从事前端工作,并以此开拓自己未来职业 2. 有任何一种编程语言基础 3. 喜欢简单粗暴学一门实用的技术,而不是做科研. Angular 2 比 Angular 1 ...

  5. QT中几个函数的使用方法

    一.把字符串转换成整形demo1:QString str = "FF";bool ok;int hex = str.toInt(&ok, 16); // hex == 25 ...

  6. ab返回结果参数分析

    Server Software    返回的第一次成功的服务器响应的HTTP头.Server Hostname    命令行中给出的域名或IP地址Server Port    命令行中给出端口.如果没 ...

  7. Xamarin.Android 使用Timer 并更改UI

    http://blog.csdn.net/ozhangsan12345/article/details/72653070 第一步:创建timer对象 //创建timer对象 Timer _dispat ...

  8. mayavi安装

    Mayavi是python的一个包,提供方便的可视化方案.目前(20150809)Mayavi还没有py3的支持,以下安装环境在python 2.7.10下进行 安装Mayavi: 1. 通过pip ...

  9. TurnipBit:DIY音乐盒教程实例

    一款可以自己DIY的音乐盒,要什么曲子,就自己谱曲啦!为他(她)制作一首他喜欢的音乐,来代表您的心意,也可以让他自己来制作他最爱的音乐哦!更可以带孩子一起体验谱写欢快的音乐. 最近发现一很好玩的中国式 ...

  10. nmon进行性能分析

    在压测的时候,搭配nmon,可以很好的记录机器cpu情况,内存情况 下载 需要下载nmon和nmon analyser,到各自的官网下载. nmon可以根据自己的操作系统版本下载二进制文件,免去安装. ...