黑马程序员技术交流社区

标题: java的设计模式常用的有哪些 [打印本页]

作者: zgjswp    时间: 2015-3-11 00:32
标题: java的设计模式常用的有哪些
在视频中学到了单例模式,忽然发现原来java有好多种设计模式,看着怪复杂的,请问除了单例模式,还有哪些常用的,都用在什么场合下面呢?

作者: 路文龙    时间: 2015-3-11 16:30
1.单例模式(有的书上说叫单态模式其实都一样)
该模式主要目的是使内存中保持1个对象。看下面的例子:

  1. <p>package org.sp.singleton;</p>
  2. <p>//方法一
  3. public class Singleton {
  4. //将自身的实例对象设置为一个属性,并加上Static和final修饰符
  5. private static final Singleton instance = new Singleton();
  6. //将构造方法设置成私有形式
  7. private Singleton() {
  8. }
  9. //通过一个静态方法向外界提供这个类的实例
  10. public static Singleton getInstance() {
  11.    return instance;
  12. }</p>
  13. <p>}</p>
复制代码


//方法二

  1. <p>class Singleton2 {</p>
  2. <p>private static Singleton2 instance2 = null;</p>
  3. <p>public static synchronized Singleton2 getInstance() {</p>
  4. <p>   if (instance2 == null)
  5.     instance2 = new Singleton2();
  6.    return instance2;
  7. }
  8. }</p>
复制代码


注:这二个方法实现了一样的功能,但个人推荐采用第一种方法。
2.工厂模式
该模式主要功能是统一提供实例对象的引用。看下面的例子:

  1. <p>public class Factory{
  2. public ClassesDao getClassesDao(){
  3.    ClassesDao cd = new ClassesDaoImpl();
  4.    return cd;
  5. }
  6. }</p>
  7. <p>interface ClassesDao{
  8. public String getClassesName();</p>
  9. <p>}</p>
  10. <p>class ClassesDaoImpl implements ClassesDao {
  11. public String getClassesName(){
  12.    System.out.println("A班");
  13. }
  14. }</p>
  15. <p>class test
  16. {
  17. public static void main(String[] args){
  18.    Factory f = new Factory();
  19.    f.getClassesDao().getClassesName();
  20. }
  21. }</p>
复制代码


这个是最简单的例子了,就是通过工厂方法通过接口获取对象的引用
3.建造模式
该模式其实就是说,一个对象的组成可能有很多其他的对象一起组成的,比如说,一个对象的实现非常复杂,有很多的属性,而这些属性又是其他对象的引用,可能这些对象的引用又包括很多的对象引用。封装这些复杂性,就可以使用建造模式。
具体看看下面的例子:
4.门面模式
这个模式个人感觉像是Service层的一个翻版。比如Dao我们定义了很多持久化方法,我们通过Service层将Dao的原子方法组成业务逻辑,再通过方法向上层提供服务。门面模式道理其实是一样的。
具体看看这个例子:

  1. <p>interface ClassesDao{
  2. public String getClassesName();</p>
  3. <p>}</p>
  4. <p>class ClassesDaoImpl implements ClassesDao {
  5. public String getClassesName(){
  6.    return "A班";
  7. }
  8. }</p>
  9. <p>interface ClassesDao2{
  10. public String getClassesName();</p>
  11. <p>}</p>
  12. <p>class ClassesDaoImpl2 implements ClassesDao {
  13. public String getClasses2Name(){
  14.    return "B班";
  15. }
  16. }</p>
  17. <p>class ServiceManager
  18. {
  19. private ClassesDao cd = new ClassesDaoImpl();
  20. private ClassesDao2 cd2 = new ClassesDaoImpl2();
  21. public void printOut(){
  22.    System.out.println(cd.getClassesName()+"   "+cd2.getClassesName());
  23. }
  24. };</p>
复制代码


虽然这个例子不全,但基本意思已经很明显了。
5.策略模式
这个模式是将行为的抽象,即当有几个类有相似的方法,将其中通用的部分都提取出来,从而使扩展更容易。
看这个例子:

  1. <p>package org.sp.strategy;</p>
  2. <p>/**
  3. * 加法具体策略类
  4. *
  5. */
  6. public class Addition extends Operation {</p>
  7. <p>@Override
  8. public float parameter(float a, float b) {
  9.    return a+b;
  10. }</p>
  11. <p>}</p>
  12. <p>package org.sp.strategy;</p>
  13. <p>/**
  14. * 除法具体策略类
  15. *
  16. */
  17. public class Division extends Operation {</p>
  18. <p>@Override
  19. public float parameter(float a, float b) {
  20.    return a/b;
  21. }</p>
  22. <p>}</p>
  23. <p>package org.sp.strategy;</p>
  24. <p>/**
  25. * 乘法具体策略类
  26. *
  27. */
  28. public class Multiplication extends Operation{</p>
  29. <p>@Override
  30. public float parameter(float a, float b) {
  31.    return a*b;
  32. }</p>
  33. <p>}</p>
  34. <p> </p>
  35. <p>package org.sp.strategy;</p>
  36. <p>/**
  37. * 减法具体策略类
  38. *
  39. */
  40. public class Subtration extends Operation {</p>
  41. <p>@Override
  42. public float parameter(float a, float b) {
  43.    return a-b;
  44. }</p>
  45. <p>}</p>
  46. <p> </p>
  47. <p>package org.sp.strategy;</p>
  48. <p>/**
  49. * 抽象策略类也可以使用接口来代替
  50. *
  51. */
  52. public abstract class Operation {</p>
  53. <p>public abstract float parameter(float a, float b);
  54. }</p>
  55. <p>package org.sp.strategy;</p>
  56. <p>/**
  57. * 策略环境类
  58. *
  59. */
  60. public class Condition {</p>
  61. <p>public static final Addition add = new Addition();</p>
  62. <p>public static final Subtration sub = new Subtration();</p>
  63. <p>public static final Multiplication mul = new Multiplication();</p>
  64. <p>public static final Division div = new Division();

  65. }</p>
  66. <p>package org.sp.strategy;</p>
  67. <p>/**
  68. * 测试客户端
  69. *
  70. */
  71. public class Client {</p>
  72. <p>public static void main(String[] args) {
  73.    float a = 100;
  74.    float b = 25;
  75.   
  76.    System.out.println(Condition.div.parameter(a, b));
  77. }</p>
  78. <p>}</p>
复制代码





作者: Mr.南郭    时间: 2015-3-11 16:49
路文龙 发表于 2015-3-11 16:30
1.单例模式(有的书上说叫单态模式其实都一样)
该模式主要目的是使内存中保持1个对象。看下面的例子:

哇咔咔,现在就学了单列设计模式,学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2