黑马程序员_java 设计模式的概述

原创 2015年07月10日 22:05:34

------- android培训java培训、期待与您交流! ----------

一、设计模式概述

1设计模式(Designpattern)是一套被反复使用、多数人知晓、经过分类编目和代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性

2、设计模式不是一种方法或技术,而是一种思想;

3、设计模式和具体的语言无关,学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低耦合,高内聚,使设计的程序可复用;

4、学习设计模式能够促进对面向对象思想的理解,反之亦然;它们相辅相成。

二、设计模式的要素

1、名字:必须有一个简单,有意义的名字;

2、问题:描述在何时使用模式;

3、解决方案:描述设计的组成部分以及如何解决问题;

4、效果:描述模式的效果以及优缺点。

三、设计模式的分类

1、创建型模式:对象的创建;

2、结构型模式:对象的组成(结构)

3、行为型模式:对象的行为。

四、常见的设计模式

1、工厂模式

      (1)简单工厂模式

                又叫静态工厂方法模式,它定义一个具体的工厂类负责创建一些类的实例。

实例:

[java] view plaincopy
  1. //简单工厂模式演示  
  2. public class SimpleFactory {  
  3.     public static void main(String[] args) {  
  4.         // 之前创建实例对象的方法:  
  5.         Student s = new Student();  
  6.         Teacher t = new Teacher();  
  7.   
  8.         // 使用工厂模式,对象由工厂类创建:  
  9.         s = (Student) new PersonFactory().createPerson("Student");  
  10.         t = (Teacher) new PersonFactory().createPerson("Teacher");  
  11.   
  12.         s.eat();// 吃饭  
  13.         t.teaching();// 授课  
  14.     }  
  15.   
  16. }  
  17.   
  18. // 人类抽象类  
  19. abstract class Person {  
  20.     public abstract void eat();  
  21. }  
  22.   
  23. // 具体学生类  
  24. class Student extends Person {  
  25.     public void study() {  
  26.         System.out.println("学习");  
  27.     }  
  28.   
  29.     @Override  
  30.     public void eat() {  
  31.         System.out.println("吃饭");  
  32.     }  
  33. }  
  34.   
  35. // 具体教师类  
  36. class Teacher extends Person {  
  37.     public void teaching() {  
  38.         System.out.println("授课");  
  39.     }  
  40.   
  41.     @Override  
  42.     public void eat() {  
  43.         System.out.println("吃饭");  
  44.     }  
  45. }  
  46.   
  47. /* 
  48.  * 开始,在测试类中每个具体的内容自己创建对象,但是,创建对象的工作如果比较麻烦, 就需要有人专门做这个事情,所以就制造了一个专门的类来创建对象。 
  49.  */  
  50. class PersonFactory {  
  51.     public static Person createPerson(String personName) {  
  52.         if ("Student".equals(personName)) {  
  53.             return new Student();  
  54.         } else if ("Teacher".equals(personName)) {  
  55.             return new Teacher();  
  56.         } else {  
  57.             return null;  
  58.         }  
  59.     }  
  60. }  

 

总结:简单工厂模式优点是客户端不需要再负责对象的创建,从而明确了各个类的职责;缺点是这个工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期的维护,于是改进为工厂方法模式。

     (2)工厂方法模式

             工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现。

实例:

[java] view plaincopy
  1. //创建工厂方法模式的演示类  
  2. public class FactoryFunction {  
  3.     public static void main(String[] args) {  
  4.         // 之前创建实例对象的方法:  
  5.         Student s = new Student();  
  6.         Teacher t = new Teacher();  
  7.   
  8.         // 使用工厂模式,对象由工厂类创建:  
  9.         s = (Student) new PersonFactory().createPerson("Student");  
  10.         t = (Teacher) new PersonFactory().createPerson("Teacher");  
  11.   
  12.         s.study();// 学习  
  13.         t.eat();// 吃饭  
  14.     }  
  15. }  
  16.   
  17. // 工厂接口  
  18. interface Factory {  
  19.     public abstract Person createPerson(String personName);  
  20. }  
  21.   
  22. // 学生工厂  
  23. class StudentFactory implements Factory {  
  24.   
  25.     @Override  
  26.     public Person createPerson(String personName) {  
  27.         if ("Student".equals(personName)) {  
  28.             return new Student();  
  29.         } else {  
  30.             return null;  
  31.         }  
  32.     }  
  33.   
  34. }  
  35.   
  36. // 教师工厂  
  37. class TeacherFactory implements Factory {  
  38.   
  39.     @Override  
  40.     public Person createPerson(String personName) {  
  41.         if ("Teacher".equals(personName)) {  
  42.             return new Student();  
  43.         } else {  
  44.             return null;  
  45.         }  
  46.     }  
  47.   
  48. }  

总结:

       优点:客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新的对象增加,只需要增加一个具体的类和具体的工厂类即可,不影响已有的代码,后期维护容易,增强了系统的扩展性,这就是设计模式的开闭原则。

       缺点:需要额外的编写代码,增加了工作量。

2、单例模式

     单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供。通过构造方法私有化避免在类的外部实例化,调用方法访问该实例,一般两种方案。

          (1)饿汉式:类被加载时创建实例,线程安全,一般用本方法。

[java] view plaincopy
  1. public class Singleton {  
  2.     private Singleton() {// 构造函数私有化,与实例调用方法一起确保实例唯一  
  3.   
  4.     }  
  5.   
  6.     // 类加载时自行实例化  
  7.     private static final Singleton instance = new Singleton();  
  8.   
  9.     // 通过工厂方法调用本类实例  
  10.     public static Singleton getInstnce() {  
  11.         return instance;  
  12.     }  
  13.   
  14. }  
             (2)懒汉式:实例在工厂方法内创建,此时存在线程安全问题,可加同步锁解决。                 
[java] view plaincopy
  1. public class Singleton {  
  2.     private Singleton() {// 构造函数私有化,与实例调用方法一起确保实例唯一  
  3.   
  4.     }  
  5.   
  6.     // 定义一个Singleton变量,与饿汉式不同的是该变量还没有初始化,另外不加final,否则该变量不能改变  
  7.     private static Singleton instance = null;  
  8.   
  9.     // 通过工厂方法调用本类实例  
  10.     public static synchronized Singleton getInstnce() {  
  11.         if (instance != null) {  
  12.             return instance;  
  13.         } else {  
  14.             return new Singleton();  
  15.         }  
  16.   
  17.     }  
  18.   
  19. }  
总结:
       单例模式优点是在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能;缺点是没有抽象层,因此扩展很难,职责过重,在一定程序上违背了单一职责。
 
3、模版设计模式
       模版方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现,比如我要知道一段代码的运行时间,可以在这段代码前后加上System.currentTimeMillis()获取执行前和执行后的时间再相减得到程序执行时间,为了方便计算其它代码的执行时间,我们把这段代码抽象到code()方法中,到用时再去定义或重写,将需运行的程序加进code()方法中,像线程中的run方法一样
 
[java] view plaincopy
  1. public abstract class GetTime {  
  2.     // 需求:请给我计算出一段代码的运行时间  
  3.     public long getTime() {  
  4.         long start = System.currentTimeMillis();  
  5.           
  6.         code();  
  7.   
  8.         long end = System.currentTimeMillis();  
  9.   
  10.         return end - start;  
  11.     }  
  12.   
  13.     public abstract void code();  
  14. }  
总结:
       模版设计模式的优点是在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求;缺点是如果算法骨架有修改的话,则需要修改抽象类。
 
4、装饰设计模式
      装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类;是继承的替代方案。个人理解一般就是将一个类通过参数传递的方式传给装饰类,然后获得装饰类的新功能,例如我们常见的IO操作就运用了装饰设计模式:
[java] view plaincopy
  1. // 想想我们在IO流中的使用  
  2.         InputStream is = System.in;//新建一个InputStream类的实例is,将System.in赋值给is  
  3.         //将is传递给装饰类InputStreamReader装饰,变成字符流  
  4.         InputStreamReader isr = new InputStreamReader(is);  
  5.         //字符流对象isr再传递给装饰类BufferedReader变成缓冲流  
  6.         BufferedReader br = new BufferedReader(isr);  
  7.         //一般到位将InputStream对象装饰成BufferedReader对象  
  8.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  9.         //一步到位将OutputStream对象装饰成BufferedWriter对象  
  10.         BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(  
  11.                 System.out)));  
  12.   
  13.         Scanner sc = new Scanner(System.in);  
 
总结:
       优点:使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意的组合这些功能。
        缺点:正因为可以随意组合,所以就可能出现一些不合理的逻辑。

黑马程序员-观察者模式(Observer)

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- 观察者模式:行为型设计模式 ...
  • huohacker
  • huohacker
  • 2014年04月07日 11:40
  • 538

黑马程序员_java多线程的一些总结(一)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、    进程和线程 1、   进程和线程的关系。 一般来说,我们运行一个应用程序的,就启动...
  • u011449569
  • u011449569
  • 2015年10月29日 00:23
  • 284

黑马程序员学习笔记 Java的三大框架

如果做javaweb开发,spring是一定要学的,现在主流还是ssh,就是strurs+hibernate+spring,其中hibernate是持久层,用来持久化数据库操作的,如果不喜欢可以学点别...
  • Mr_April
  • Mr_April
  • 2015年07月03日 17:12
  • 1534

关于我在黑马程序员培训毕业后的亲身体验

首先申明:我本人已经于2016年5月份在广州传智播客java培训完毕业,和黑马程序员官网没有任何的利益往来,也没有人出钱给我帮他们做软文推广,这是我在黑马程序员的亲身体验,不存在虚构。...
  • wjycgl
  • wjycgl
  • 2017年04月20日 15:27
  • 1636

黑马程序员——Java基础测试题

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 黑马程序员——Java基础测试题 第1题:以下代码哪个是正确的?为什么?   a. byte...
  • liu007004
  • liu007004
  • 2015年01月16日 12:49
  • 1369

黑马程序员:Java学习路线图上线了

——你要的就在这!   从几何时,网络家喻户晓;从什么时候开始网上搜索东西都要收费才能下载;又是从何时起网上再也找不到真正有用的资源,除了交钱再无他法了吗?不,今天告诉你,好的资源一直以来不怕分享...
  • itcast_cn
  • itcast_cn
  • 2016年10月27日 11:19
  • 2320

黑马程序员-java就业面试题大全(持续更新)

1、一个"java"源文件中是否可以包含多个类()?
  • zj3911507
  • zj3911507
  • 2014年06月20日 16:32
  • 1905

黑马程序员:Java学习路线大揭秘连载2-JavaWeb篇!

编程语言Java,已经21岁了。从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的。Java应用的广泛已...
  • itcast_cn
  • itcast_cn
  • 2016年10月18日 17:44
  • 1423

黑马程序员——网络爬虫

------- android培训、java培训、期待与您交流! ----------
  • yonggandeyangguang
  • yonggandeyangguang
  • 2014年09月24日 12:14
  • 217

黑马程序员_学习笔记JAVA基础总结

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!------- 1、方法重载 方法覆盖 重载:一个类中一种功能的多种实现方式,调用哪种实现...
  • qq_27123965
  • qq_27123965
  • 2015年04月19日 14:39
  • 397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员_java 设计模式的概述
举报原因:
原因补充:

(最多只允许输入30个字)