`
Kingson_Wu
  • 浏览: 123728 次
文章分类
社区版块
存档分类
最新评论

OOAD之设计模式-创建模式

 
阅读更多

http://blog.csdn.net/mudeer2012/article/details/8453062

先来说说模式的概念吧。

模式就是:具有代表性的某些重复问题的解决方案,是进过多次证实,与业务无关的方案。

它们都有特定的名称和适用的环境。模式的使用为我们带来了复用性的提高和可维护性的提高,同时可以增强表达能力。因为它是整个解决方案的总结。

一、模式的主要分类

模式分为两大类:设计模式和架构模式。

根据group of four 定义的23种模式和MVC模式,总共有24种。

其中设计模式又分为三小类:设计模式是系统局部出现的某一核心问题的解决方案

1.1创建型模式

创建模式:是用于创建对象。

包括单列、工厂、建造者、原型四种模式。

1.2结构型模式

结构模式:是用于组织类和对象之间关系的,形象的说就是对象间的组织形式。

包括桥梁、装饰器、适配器、外观、代理模式等。

1.3行为型模式

行为模式:是用于对象交换和职责分配的,形象的说就是方法的组织形式。

包括方法模板、策略、观察者、命令模式等。

另外架构模式是用于指导整个系统的整体的组织结构,规划,指南,用来组织预定义的职责分明的子系统。

二、创建模式

2.1单列模式singleton

顾名思义:这种设计模式是为了保证整个类只会产生一个对象,它是唯一的存在,通常用于独一无二的最高控制者。

在应用系统开发时,经常需要让系统管理一些软件内外部资源,这些内外部资源中有些只能有一个实例。

共有3种方法实现,各有不同的效果:

2.1.1预加载

构造方法私有,有一个静态属性是本身的一个对象。加载类时直接赋值构造一个对象。有静态方法可以获取该对象的引用。

  1. //单例(态)模式一
  2. //优点:线程绝对安全,多线程情况下不排队
  3. //缺点:预加载导致不使用也产生了对象
  4. //publicclassSingleton{
  5. //
  6. ////静态的对象,保证了全类共享一个对象
  7. //privatestaticSingletoninstance;
  8. //
  9. //static{
  10. //instance=newSingleton();
  11. //}
  12. //
  13. ////私有的构造方法
  14. //privateSingleton(){
  15. //
  16. //}
  17. //
  18. //publicstaticSingletongetInstance(){
  19. //returninstance;
  20. //}
  21. //
  22. //}


2.1.2延时加载

构造方法私有,有一个静态属性是本身的一个对象。用一个静态同步方法来赋值,第一次调用给静态属性赋值,之后直接提取值。

  1. //单例模式二
  2. //优点:延迟加载(当真正需要对象的时候才产生)
  3. //缺点:多线程情况下要排队
  4. //publicclassSingleton{
  5. //privatestaticSingletoninstance=null;
  6. //
  7. //privateSingleton(){
  8. //
  9. //}
  10. //
  11. //publicsynchronizedstaticSingletongetInstance(){
  12. //if(instance==null){
  13. //instance=newSingleton();
  14. //}
  15. //returninstance;
  16. //}
  17. //}
2.1.3高并发延时加载

构造方法私有,有一个静态属性是本身的一个对象。有一个静态方法给它赋值,代码块中使用双锁机制来控制。

  1. //单例模式三(Java不支持)
  2. //别名:双锁机制
  3. //实现延迟加载、并支持高并发!
  4. publicclassSingleton{
  5. privatestaticSingletoninstance=null;
  6. privateSingleton(){
  7. }
  8. publicstaticSingletongetInstance(){
  9. if(instance==null){
  10. synchronized(Singleton.class){
  11. if(instance==null){
  12. instance=newSingleton();
  13. }
  14. }
  15. }
  16. returninstance;
  17. }
  18. }

2.2工厂模式factory

2.2.1简单工厂

简单工厂中,工厂是单一的。产品有一种,有一个抽象父类,下面是各种产品。工厂有只能制造同一种类型产品的方法。不支持开闭。

对于消费者来说,同样的产品需求只有一种选择。
当工厂只生产同一品种的具体产品,而且产品数量有限的时候,可以考虑使用简单工厂模式。

  1. packagecom.lovo.factory.simplefactory;
  2. /**
  3. *@authorAdministrator
  4. *简单工厂:静态的工厂,动态的产品
  5. */
  6. publicclassKFCFactory{
  7. publicstaticKFCProductorder(Stringmsg){
  8. if(msg.equals("汉堡")){
  9. returnnewHumburger();
  10. }elseif(msg.equals("薯条")){
  11. returnnewChips();
  12. }else{
  13. returnnull;
  14. }
  15. }
  16. }


  1. packagecom.lovo.factory.simplefactory;
  2. publicabstractclassKFCProduct{
  3. publicabstractvoidtasty();
  4. }


  1. packagecom.lovo.factory.simplefactory;
  2. publicclassChipsextendsKFCProduct{
  3. @Override
  4. publicvoidtasty(){
  5. //TODOAuto-generatedmethodstub
  6. System.out.println("KFC的薯条!");
  7. }
  8. }


  1. packagecom.lovo.factory.simplefactory;
  2. publicclassHumburgerextendsKFCProduct{
  3. @Override
  4. publicvoidtasty(){
  5. //TODOAuto-generatedmethodstub
  6. System.out.println("鸡腿堡!!!");
  7. }
  8. }


2.2.2工厂方法

工厂方法中,工厂有多种,都有抽象类。只有一种类型的产品即一个产品族,下面有该类产品的具体实现子类。有工厂抽象父类,该类中定义所有工厂的公共方法,子类工厂可以有不同的实现,兼容各自的特色。

对于消费者来说,同样的产品需求有不同的选择。它只能生产同一种类的具体产品

  1. packagecom.lovo.factory.factorymethod;
  2. /**
  3. *@authorAdministrator
  4. *工厂是动态的,产品是不动的
  5. */
  6. publicabstractclassHumburgerFactory{
  7. publicabstractHumburgerorder();
  8. }


  1. packagecom.lovo.factory.factorymethod;
  2. publicclassKFCFactoryextendsHumburgerFactory{
  3. @Override
  4. publicHumburgerorder(){
  5. //TODOAuto-generatedmethodstub
  6. System.out.println("KFC汉堡");
  7. returnnewHumburger();
  8. }
  9. }
  1. packagecom.lovo.factory.factorymethod;
  2. publicclassMCDFactoryextendsHumburgerFactory{
  3. @Override
  4. publicHumburgerorder(){
  5. //TODOAuto-generatedmethodstub
  6. Humburgerhum=newHumburger();
  7. System.out.println("MCD汉堡");
  8. returnhum;
  9. }
  10. }



2.2.3抽象工厂

抽象工厂中工厂和产品都具有抽象类,工厂和产品都可以多样化。产品有2个及以上的产品族,并且这些产品相互间有。抽象工厂集成了多个产品族的生产方法,具体的工厂实现自己的产品生产方法。消费者自由选择各种搭配。

工厂类层次与具体的产品类层次通常是平行的(即一一对应的)。
增加一个具体类,一般也要相应地增加一个工厂类,增加了系统复杂度。

在以下情况下,应当考虑使用抽象工厂模式:
1-这个系统的产品有多于一个的产品族。
2-同属于同一个产品族的产品是设计成在一起使用的。产品之间有特殊的相关或依赖关系。产品之间应该最少应该有两种关系,纵向来看每种产品组内部产品之间有继承关系,例如产品AbstractProductA与ProductA1和ProductA2之间有继承关系,是同一产品族产品;横向来看两个产品族之间的产品也应该有一一对应关系,例如ProductA1与ProductB1之间,或ProductA2与ProductB2之间的对应关系。

2.3建造者模式builder

建造模式(Builder Pattern)的定义为:把复杂对象的构造过程从对象的表示中分离出来,其直接效果是将一个复杂的对象简化为一个比较简单的目标对象。
一个产品经常由不同的组成成分作为产品的部件,不同的产品可以有不同的部件。使用建造模式,可以使客户端不需要知道所生成的产品有哪些部件、每个产品的对应部件有什么不同、是如何建造出来的、以及如何组装产品。
建造模式的使用时机:
当创建一个复杂对象的算法应该独立于组成该对象的部分以及如何组装时。
当构造过程必须允许要创建的对象有不同的表示时。
当我们想要将客户与实际创建过程或者结果产品隔离时
被创建的对象不需要知道其创建细节。
创建的代码与表示的代码分离,二者都很容易被替代而不至于相互影响。
我们可以控制创建过程。
我们可以独立地重用或者更改创建过程或产品。
  1. publicabstractclassBuilder{
  2. privatePartApa;
  3. privatePartBpb;
  4. privatePartCpc;
  5. privateResultresult;
  6. publicabstractvoidbuildA();
  7. publicabstractvoidbuildB();
  8. publicabstractvoidbuildC();
  9. publicResultgetResult(){
  10. returnthis.result;
  11. }
  12. }
  1. publicabstractclassDirector{
  2. privateBuilderbuilder;
  3. publicBuildergetBuilder(){
  4. returnbuilder;
  5. }
  6. publicvoidsetBuilder(Builderbuilder){
  7. this.builder=builder;
  8. }
  9. publicabstractvoidcontact();
  10. }

2.4原型模式prototype

原型模式是通过拷贝一个现有对象生成新对象的。
为了实现深度克隆,经常要使用流来读取拷贝对象,在读出一个新的对象。

  1. packagecom.lovo.prototype;
  2. importjava.io.ByteArrayInputStream;
  3. importjava.io.ByteArrayOutputStream;
  4. importjava.io.IOException;
  5. importjava.io.ObjectInputStream;
  6. importjava.io.ObjectOutputStream;
  7. importjava.io.Serializable;
  8. //publicclassBasketballStarimplementsCloneable{
  9. publicclassBasketballStarimplementsSerializable{
  10. privateStringname;
  11. privateintage;
  12. privatefloatheight;
  13. privateSkilltheSkill;
  14. publicBasketballStar(){
  15. }
  16. publicBasketballStar(Stringname,intage,floatheight){
  17. super();
  18. this.name=name;
  19. this.age=age;
  20. this.height=height;
  21. }
  22. publicintgetAge(){
  23. returnage;
  24. }
  25. publicvoidsetAge(intage){
  26. this.age=age;
  27. }
  28. publicfloatgetHeight(){
  29. returnheight;
  30. }
  31. publicvoidsetHeight(floatheight){
  32. this.height=height;
  33. }
  34. publicStringgetName(){
  35. returnname;
  36. }
  37. publicvoidsetName(Stringname){
  38. this.name=name;
  39. }
  40. publicSkillgetTheSkill(){
  41. returntheSkill;
  42. }
  43. publicvoidsetTheSkill(SkilltheSkill){
  44. this.theSkill=theSkill;
  45. }
  46. publicBasketballStardeepClone(){
  47. BasketballStarbs=null;
  48. //序列化
  49. ObjectOutputStreamoos=null;
  50. ByteArrayOutputStreambos=null;
  51. try{
  52. bos=newByteArrayOutputStream();
  53. oos=newObjectOutputStream(bos);
  54. oos.writeObject(this);
  55. }catch(IOExceptione){
  56. //TODOAuto-generatedcatchblock
  57. e.printStackTrace();
  58. }finally{
  59. if(oos!=null){
  60. try{
  61. oos.close();
  62. }catch(IOExceptione){
  63. //TODOAuto-generatedcatchblock
  64. e.printStackTrace();
  65. }
  66. }
  67. }
  68. //反序列化
  69. ObjectInputStreamois=null;
  70. ByteArrayInputStreambis=null;
  71. try{
  72. bis=newByteArrayInputStream(bos.toByteArray());
  73. ois=newObjectInputStream(bis);
  74. bs=(BasketballStar)ois.readObject();
  75. }catch(IOExceptione){
  76. //TODOAuto-generatedcatchblock
  77. e.printStackTrace();
  78. }catch(ClassNotFoundExceptione){
  79. //TODOAuto-generatedcatchblock
  80. e.printStackTrace();
  81. }finally{
  82. if(ois!=null){
  83. try{
  84. ois.close();
  85. }catch(IOExceptione){
  86. //TODOAuto-generatedcatchblock
  87. e.printStackTrace();
  88. }
  89. }
  90. }
  91. returnbs;
  92. }
  93. //publicObjectclone()throwsCloneNotSupportedException{
  94. //BasketballStarbs=(BasketballStar)super.clone();
  95. //bs.setTheSkill((Skill)this.getTheSkill().clone());
  96. //returnbs;
  97. //}
  98. @Override
  99. publicStringtoString(){
  100. //TODOAuto-generatedmethodstub
  101. returnthis.name+""+this.age+""+this.height;
  102. }
  103. }


  1. packagecom.lovo.prototype;
  2. importjava.io.Serializable;
  3. //publicclassSkillimplementsCloneable{
  4. publicclassSkillimplementsSerializable{
  5. privateintshooting;
  6. privateintpassing;
  7. privateintcrossing;
  8. privateintjumping;
  9. publicSkill(){
  10. }
  11. publicSkill(intshooting,intpassing,intcrossing,intjumping){
  12. super();
  13. this.shooting=shooting;
  14. this.passing=passing;
  15. this.crossing=crossing;
  16. this.jumping=jumping;
  17. }
  18. publicintgetCrossing(){
  19. returncrossing;
  20. }
  21. publicvoidsetCrossing(intcrossing){
  22. this.crossing=crossing;
  23. }
  24. publicintgetJumping(){
  25. returnjumping;
  26. }
  27. publicvoidsetJumping(intjumping){
  28. this.jumping=jumping;
  29. }
  30. publicintgetPassing(){
  31. returnpassing;
  32. }
  33. publicvoidsetPassing(intpassing){
  34. this.passing=passing;
  35. }
  36. publicintgetShooting(){
  37. returnshooting;
  38. }
  39. publicvoidsetShooting(intshooting){
  40. this.shooting=shooting;
  41. }
  42. @Override
  43. publicStringtoString(){
  44. //TODOAuto-generatedmethodstub
  45. returnthis.shooting+""+this.passing+""+this.crossing+""+this.jumping;
  46. }
  47. //@Override
  48. //publicObjectclone()throwsCloneNotSupportedException{
  49. ////TODOAuto-generatedmethodstub
  50. //returnsuper.clone();
  51. //}
  52. }
分享到:
评论

相关推荐

    ooad设计模式软件架构分析资料

    《ooad设计模式软件架构分析资料》集合涵盖了面向对象编程、软件架构、设计模式、软件分析以及UML等多个核心IT领域的经典著作。这些资源对于深入理解软件开发过程、提升设计能力以及优化项目管理具有极高的价值。 ...

    设计模式-javaOOAD

    GoF(Gang of Four)设计模式由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者共同编写,是面向对象设计模式领域的经典之作。这些模式覆盖了创建型、结构型和行为型三个方面,旨在解决软件开发...

    软件开发方法与环境--设计模式(ppt)

    设计模式是软件开发者的必备技能之一,掌握好设计模式可以显著提高软件的质量和可维护性,是成为一名优秀软件工程师的关键步骤。通过深入学习和实践,我们可以更好地理解和应用这些模式,以应对复杂的软件开发挑战。

    OOAD-assignment2-refactoring

    【标题】"OOAD-assignment2-refactoring"指的是面向对象分析与设计(Object-Oriented Analysis and Design,简称OOAD)课程的第二次作业,重点在于重构。重构是软件开发过程中的一个重要环节,它旨在改善代码结构,...

    面向对象分析与设计课件(OOAD、英文)

    设计模式,如工厂模式、单例模式、观察者模式等,也是设计阶段的重要工具,它们提供了解决常见设计问题的标准化方法。 3. 对象分析(Object Analysis):OOAD - Lecture 3 Object Analysis (ch09-11).pdf 对象分析...

    OOAD.rar_设计模式 例

    在这个名为"OOAD.rar_设计模式 例"的压缩包中,我们可能找到一个具体实现Observer模式的例子,该例子模拟了Java AWT(Abstract Window Toolkit)中的事件监听机制。AWT是Java早期的图形用户界面库,它支持事件驱动...

    面向对象分析设计OOAD.zip

    本压缩包包含了一系列关于OOAD的资料,涵盖了设计原则、UML建模、设计模式等多个关键知识点。 1. **设计原则**:设计原则是指导面向对象设计的基础,如单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则...

    OOAD教师用书(IBM 原厂)word版

    设计模式是OOAD中另一个重要的话题。设计模式是解决常见软件设计问题的标准化解决方案,如单例模式、工厂模式、观察者模式等。IBM的教材会详细讲解这些模式的原理、应用场景和实现方式,帮助学生掌握如何在实际项目...

    OOAD 台湾 著名设计开发人员做的关系系统设计与分析的PPT

    4. **设计模式**:介绍常见的设计模式,如工厂模式、单例模式、观察者模式等,及其在解决特定问题时的应用。 5. **系统架构**:探讨整体系统架构的选择,如三层架构或微服务架构,以及它们的优势和挑战。 6. **...

    OOAD系列PPT

    第三章“创建型设计模式”重点讲解了工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式。这些模式主要关注对象的创建,能够灵活地控制实例化过程,减少类之间的耦合。 第四章“结构型设计模式”涉及适配器...

    OOAD2010级-2012级考题1

    GRASP是一组设计原则,指导如何在面向对象设计中分配职责,如控制器、多态、工厂等模式。 **FURPS(功能、可用性、可靠性、性能、可维护性)** FURPS是评价软件质量的标准,涵盖了系统的主要非功能需求。 **RUP...

    OOAD课堂练习作业和代码

    **面向对象分析与设计(OOAD)是软件开发过程中至关重要的一环,它涉及到对问题域的...每个课堂练习都可能涵盖特定的设计模式、UML图的绘制或是对特定问题的解决方案。在实践中学习,无疑是掌握这些概念的最佳途径。

    OOAD.rar_OOAD

    总的来说,"OOAD.rar_OOAD"这个资源很可能是面向对象分析与设计的教程或指南,其中的"OOAD.pdf"可能涵盖了这些核心概念、原则以及设计模式的详细解析,对于程序员提升面向对象编程能力具有极高的价值。学习并熟练...

    java设计模式案例

    压缩包中的"ooad"可能是指面向对象分析与设计(Object-Oriented Analysis and Design),这通常涉及到UML(统一建模语言)的使用,如类图、序列图、用例图等,它们可以帮助我们更好地理解和设计使用设计模式的系统。...

    Head First OOAD

    这本书以生动易懂的方式讲解了如何在实际项目中应用面向对象原则和设计模式,是IT从业者提升自身软件开发能力的重要参考资料。 该压缩包文件包含的是书中所有源代码示例,可以帮助读者更直观地理解书中的概念和方法...

    ooad book

    书中可能涵盖了如工厂模式、单例模式、观察者模式等常见的设计模式,这些模式都是OOAD的基础。设计模式是一种通用的、经过实践验证的解决方案,可以帮助开发者更好地理解和解决软件设计中的复杂性。 Java OOAD则...

    西北农林科技大学OOAD实验.rar

    3. **设计模式**:设计模式是解决常见软件设计问题的标准解决方案,如工厂模式、单例模式、观察者模式等,学生会在实践中应用这些模式来提高代码的可读性和可维护性。 4. **类与对象**:理解类的定义、属性和方法,...

    面向对象OOAD课件

    12. **设计模式**:设计模式是面向对象设计中经过验证的解决方案,用于解决常见问题。例如,工厂模式用于创建对象,观察者模式用于事件驱动的通信。 OOAD的过程通常包括需求分析、用例建模、类建模、接口建模和实现...

    OOAD第十一章1

    在OOAD(面向对象分析与设计)中,设计模式是构建高质量、可扩展和可维护软件的关键工具。本篇将深入探讨标题和描述中提到的一些核心设计模式,包括Singleton(单例模式)、Adapter(适配器模式)、Strategy(策略...

    2本OOAD的书.快来下呀!

    2. 设计模式:工厂模式、单例模式、观察者模式、装饰器模式等,它们是解决常见软件设计问题的模板。 3. UML(统一建模语言):用例图、类图、序列图、状态图等,它们用于可视化地表达系统设计。 4. 面向对象分析:...

Global site tag (gtag.js) - Google Analytics