java23种设计模式理解和练习总结

来源:互联网 发布:时间都去哪儿了 知乎 编辑:程序博客网 时间:2024/05/22 13:32

思路源泉来自这类原文:Java开发中的23种设计模式详解(转)

有些人看了这篇可能只是转载或者收藏,对我来说就是写,练习,要有自己的理解。
看完保证你了解了主干,并会用格式。
本文以问题来驱动,以UML图来理解设计模式
1、工厂方法模式
分三种。
先直接看下面这个先。
1-1、普通工厂模式
description:
说白了在代码体现就是建立一个工厂,然后里面有个生产方法创建实现同一个接口的对应的实现类对象。
exercises:
设计一个发送接口(Sender),有send()方法。
有两个实现类发送邮件(EmailSender)和发送短信(MessgeSender)类,
建立工厂,工厂里有一个方法produce方法,形式public Sender produce(String type){}
该方法要求:如果是EmailSender类型则new该类对象,如果是MessgeSender类则new该类对象,
方法返回传入参数对应类型对象。
FactoryTest测试使用。
UML diagram:
an possible answer(source):
1-2:多个工厂方法模式
description:
在上述模式中改进,不再使用单独一个方法。有问题:如果传递的字符串有问题,则不能正确创建对象
所以,把生产方法改为创建对应对象创建对应生产方法。
exercises:
现把上述练习题produce方法分解为创建对应对象创建对应生产方法。
UML diagram:
an possible answer(source):
1-3:静态工厂方法模式
description:
在上述模式中改进,其实就是把上述生产的方法为静态的,加上static。类名来调用。
exercises:
UML diagram:
an possible answer(source):
总结:
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。
在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,
第三种相对于第二种,不需要实例化工厂类,
所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
2、抽象工厂模式
简单的说,顾名思义,工厂方法模式就是,在一个工厂类中有工厂方法,创建对应对象,该方法有许多实现,比较好的是上诉第三种,但是问题来了,如果还想扩展程序,则必须修改该工厂类,这不符合闭包原则,我也不懂这是什么原则,反正我的理解就是要对该类不要修改或者修改较少。
而抽象工厂模式是什么呢?也是顾名思义,就是抽象,怎么抽象,就是在原来方法抽出来,也就是,对应创建对象的方法有对应的工厂类,不再是一个。
先看图:
UML diagram:
an possible answer(source):
从上面代码可以看出,有两个接口,一个产品接口,一个产品工厂接口,前者有两种产品实现类,后者则有对应产品的工厂实现类。
好处:扩展呗,不需要修改现有代码,只需要增加对应的工厂类即可。
3、单例模式
不说什么专业术语,只说大白话,
总体的代码体现就是私有化静态属性和构造函数,然后提供一个公有的方法得到该对象。
看个例子:
这样可以满足基本要求,但是在多线程环境下,则会出安全问题,什么是安全问题,为什么会?我的理解就是,在两个线程下,理解为两条时间线,比较科幻,用了漫威的那些。尼玛,写到这里就想了解多线程了,还查了资料从jvm的角度来看多线程。http://blog.csdn.net/clj198606061111/article/details/54897292。在java中,多线程间进行通信的唯一途径就是通过类变量和实例变量。也就是说,如果一段多线程程序中如果没有类变量和实例变量,那么这段多线程程序就一定是线程安全的。反过来说,就是不安全的。说真的,不了解许多根本就是一个菜鸟,即时了解了许多还是一个无知,宇宙这么大,了解都了解不完。

都是为了解决类变量和实例变量共享的安全问题。
都是为了解决类变量和实例变量共享的安全问题。
都是为了解决类变量和实例变量共享的安全问题。
都是为了解决类变量和实例变量共享的安全问题。
不说别的,回归正传。
那么这么解决呢?
同步嘛,肯定是synchronized
现在有个问题,就是该关键字放哪?
看那篇应该就是放方法里面。
将synchronized关键字加在了内部,也就是说当调用的时候是不需要加锁的,只有在instance为null,并创建对象的时候才需要加锁,性能有一定的提升。
都是为了解决类变量和实例变量共享的安全问题。
实际情况是,单例模式使用内部类来维护单例的实现,JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的
都是为了解决类变量和实例变量共享的安全问题。
在Java指令中创建对象和赋值操作是分开进行的,
互斥机制都是为了解决类变量和实例变量共享的安全问题。
什么是互斥,互斥就是同一个时间只能一个。不是1就是0,在这就联想到数学上互斥事件。就是都是为了解决类变量和实例变量共享的安全问题。
不可能同时发生的事件。
不可能同时发生的事件。
使用内部类可以避免这个问题,因为在多线程环境下,jvm对一个类的初始化会做限制,同一时间只会允许一个线程去初始化一个类,这样就从虚拟机层面避免了大部分单例实现的问题,可以尝试下
待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
都是为了解决类变量和实例变量共享的安全问题。

0 0
原创粉丝点击