`
collegeyuan
  • 浏览: 31178 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

常见的设计模式

 
阅读更多

设计模式常常分为如下三类:

    创建型:创建对象时,不在直接实例化对象;而是根据特定场景,由应用程序来确定创建对象的方式,从而保证更高的性能,更好的架构优势。创建型模式主要有简单工厂模式、工厂方法、抽象工厂模式、单列模式、生成器和原型模式。

    结构型:用于帮助多个对象组织成更大的结构。结构型模式主要有适配器模式、桥接模式、组合器模式、装饰器模式、门面模式、享元模式和代理模式。

    行为型:用于帮助系统间各对象的通信,以及如何控制复杂系统中的流程。行为型模式主要有命令模式、解释器模式、迭代模式、中介者模式、备忘录模式、状态模式、策略模式、模板模式、访问这模式。

1、单列模式

      有些时候,运行自由创建某个类实例没有意义,还有可能造成系统性能下降(因为创建对象所带来的系统开销问题)。

     主要点:

           1)将构造器用private修饰

           2)提供一个public  static方法,供获取该类对象

           3)该类需缓存一个已经创建的对象,否则该类无法知道是否已经创建对象。

        示例如下:

           class Singleton{

                 private static Singleton instance;

                 private Singleton(){

                   }

                  public static Singleton getInstance(){

                       if(instance == null){

                             instance = new Singleton();

                          }

                         return   instance;

                   }

                }

 

2、简单工厂模式

      将多个对象交给工厂来生成的设计方式被称为简单工厂模式。

      例如A类依赖于B类。对于A类而言,它并不关心B对象的实现、创建过程。考虑B类实现一个IB接口,而A类只需要与IB接口耦合——A类并不直接使用new关键字来创建B实例,而是重定义一个工厂类:IBFactory,由该工厂来负责创建IB实现,而A类通过调用IBFactory工厂的方法来得到IB的实例。

      下面一个简单的实例来说明简单工厂模式:假设有个Computer对象需要依赖一个输出设备(Printer对象)。让Computer类依赖output属性,将computer类与printer类实现分离,Computer对象只需面向output接口编程即可。computer对象具体依赖哪个实现类完全透明。

      public class Computer{

            private Output out;

            public Computer (Output out){

                this.out = out;

             }

          public void keyIn(String msg){

                 out.getData(msg);

           }

           public void print(){

               out.out();

            }

         public static void main(String[] args){

            outputFactory of =new outputFactory ();

            Computer c = new Computer(of.getOutput());

            c.keyIn("轻量级java“);

            c.print();

         }

     }

以上代码可以看出computer类与printer类已经分离了,只是与该接口耦合。而且Computer不再负责创建output对象,系统将提供一个Output工厂类负责生成output对象,outputFactory工厂类如下:

          public class OutputFactory{

                   public Output getOutput(){

                       return new Printer();

                  }

             }

     以上类提供一个getOutput()方法,该方法返回一个output实例,该方法负责创建output实例,具体创建哪一个实现类的对象,则由该方法决定。

        程序清单:   Printer.java代码如下:

             public class Printer{

                     private String[] printData = new String[MAX_CACHE_LINE);

                       //用以记录当前需打印的页数

                     private int dataNum=0;

                     public void out(){

                            //z只要有作业,继续打印

                            System.out.println("打印机打印:” + printData[0];

                             //把作业队列整体前移一位,并将剩下的作业数减一

                            System.arraycopy(printData,1,printData,0,--dataNum);

                      }

                }

               public void getData(String msg){

                          if(dataNum >= MAX_CACHE_LINE){

                                 System.out.println("输出队列已满,添加失败“);

                            }else{

                                 printData[dataNum++] = msg;

                            }

                 }

           }

     上面的printer类模拟了一个简单的打印机,如果系统需要重构,需要使用BetterPrinter来代替Printer类,则需要让BetterPrinter师兄Output接口,并改下OutputFactory类的getOutput()方法。

      将OutputFactory类的getOutput()方法改成如下:

            return new BetterPrinter();

   通过这种方式,可以把所有生成Output对象的逻辑集中在OutputFactory工厂类中管理,所有需要Output对象的类需要与Output接口耦合,而不是与具体的实现类耦合,即使系统中有很多类依赖Printer对象,只需要修改OutputFactory类的getOutput()方法,返回BetterPrinter对象即可。

        使用简单工厂模式的优势:让对象的调用者和对象的创建过程分离,当对象调用者需要对象时,直接向工厂请求即可,从而避免对象的调用和对象的实现类以硬编码方式耦合。以提供系统的维护性、扩展性。但工厂模式有个小缺陷:当产品修改时,对应的工厂类也需要修改。

 

3、抽象工厂

    在简单工厂模式里,系统使用工厂类生产所有产品实例,且改工厂类决定生产哪个类的实例,即该工厂类负责所有的逻辑判断、实例创建工作。

    如果不想在工厂类中进行逻辑判断,程序为不同的产品类提供不同的工厂,不同的工厂类生产不同的产品。例如为上面的Printer、BetterPrinter提供PrinterFactory和BetterFactory工厂类。

    本示例将2中的outputFactory该为一个接口,并为该接口提供两个实现类:PrinterFactory和BetterPrinterFactory 

     OutputFactory接口代码如:

      public  interface OutputFactory{

          Output getOutput();

       }

       PrinterFactory实现类如下:

         public class PrinterFactory implements  OutputFactory{

              public Output getOutput(){

                 return new Printer();

             }

           }

       BetterPrinterFactory 实现类如下:

            public class BetterPrinterFactory implements  OutputFactory{

              public Output getOutput(){

                 return new BetterPrint();

             }

           }

    修改2中的Couputer类如下:

               public class Computer{

            private Output out;

            public Computer (Output out){

                this.out = out;

             }

          public void keyIn(String msg){

                 out.getData(msg);

           }

           public void print(){

               out.out();

            }

         public static void main(String[] args){

            outputFactory of =new PrinterFactory ();

            Computer c = new Computer(of.getOutput());

            c.keyIn("轻量级java“);

            c.print();

         }

     }

    当程序需要调用Output对象的方法时,需要显示的创建不同的工厂实例。程序中创建的是PrinterFactory 实例。这种方式虽然不会修改工厂类的方法,但会带来另一种耦合,客户端代码和工厂类的耦合。

    在这种模式下新增一个OutputFactoryFactory工厂类,改工厂类提供了一个getOutputFactory(String type)方法,改方法用于返回一个OutputFactory工厂示例。下面是OutputFactoryFactory的代码:

        public class OutputFactoryFactory{

               public static  OutputFactory  getOutputFactory(String type){

                       if(type.equalsIngnoreCase("better"){

                           return new BetterPrinterFactory();

                         }else{

                             return new PrinterFactory();

                         }

                  }

            }

        修改Computer类的Mian方法如下:

        public static void main(String[] args){

              outputFactory of =OutputFactoryFactory.getoutputFactory("better");

            Computer c = new Computer(of.getOutput());

            c.keyIn("轻量级java“);

            c.print();

        }

   上面程序中用于产生一个OutputFactory工厂,但具体产生哪个工厂则由OutputFactoryFactory抽象工厂决定,不同的工厂生产不同的output对象,通过采用抽象工厂模式,系统可以让客户端代码与被调用对象实现类、具体的工厂类实现分离。

     如果工厂直接生产被调用对象,那就是简单工厂模式,如果工厂生产了工厂对象,那就升级为抽象工厂模式。

分享到:
评论

相关推荐

    常见设计模式的解析和实现

    “常见设计模式的解析和实现”这一标题明确地指出了文章的主题:针对软件工程领域内被广泛采用的设计模式进行深入分析,并通过实际代码示例进行展示。设计模式是一种在特定情境下解决常见问题的有效方式,它不仅能够...

    常见设计模式的解析和实现(C++)整理版

    常见设计模式的解析和实现(C++)整理版,整理挺全面

    常见设计模式的解析和实现(C++)

    常见设计模式的解析和实现(C++)常见设计模式的解析和实现(C++)常见设计模式的解析和实现(C++)常见设计模式的解析和实现(C++)

    常见设计模式的解析和实现(C++版)

    本资料“常见设计模式的解析和实现(C++版)”深入探讨了在C++环境中如何理解和应用这些模式。 首先,我们要了解设计模式的基本分类。设计模式分为三大类:创建型模式、结构型模式和行为型模式。创建型模式关注对象...

    C++常见设计模式的解析和实现+源码解析.rar

    常见设计模式的解析和实现(C++),真的很经典,我也在学 常见设计模式的解析和实现(C++)之一-Factory模式 常见设计模式的解析和实现(C++)之二-Abstract Factory模式 常见设计模式的解析和实现(C++)之三-Builder模式 ...

    常见设计模式举例说明

    常见设计模式举例说明 设计模式是软件开发中的一种解决方案,它可以帮助开发者更好地解决软件设计中的问题。这里,我们将对 9 种常见的设计模式进行详细的解释和举例说明。 创建型模式 创建型模式是将对象的创建...

    C++常见设计模式的解析和实现

    在软件开发领域,设计模式是经过时间和实践验证的解决方案,用于解决常见的编程问题。C++作为一门强大的面向对象编程语言,其丰富的特性和强大的功能使得设计模式的应用更加广泛。以下是对标题和描述中提到的一些...

    常见设计模式的解析和实现(含C++源码)

    本资源包含对常见设计模式的深入解析以及C++语言的实现代码,对于理解和应用设计模式有极大的帮助。 首先,我们来了解一下设计模式的基本分类。设计模式通常分为三类:创建型模式、结构型模式和行为型模式。 1. **...

    C#设计模式/常见设计模式的解析和实现(C++)/设计模式迷你手册.rar

    《常见设计模式的解析和实现(C++)》可能详细解释了C++中的设计模式实现,C++作为强类型、静态类型的面向对象语言,其模板元编程和运算符重载特性为实现某些模式提供了独特的方式。例如,C++的模板可以用于实现策略...

    20种常见设计模式的C++实现

    本资源"20种常见设计模式的C++实现"涵盖了一些最核心的设计模式,以下是这些模式的详细介绍: 1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供一个全局访问点。在C++中,通常通过私有构造函数和静态...

    java开发的几种常见设计模式

    java开发的几种常见设计模式. 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new...

    常见设计模式示例(C#实现)

    以下是对“常见设计模式示例(C#实现)”中涉及的一些主要设计模式的详细解释: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在C#中,可以使用`static`修饰符和私有构造函数来实现,或者利用...

    常见设计模式代码及类图

    本资源包“常见设计模式代码及类图”包含了多种常用的设计模式的实现和类图解析,以下是对这些模式的详细讲解: 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。在代码中,你可以看到如何...

    design-pattern(设计模式,包括创建型、结构型、行为型三大类共23种常见的设计模式和J2EE常见设计模式等).zip

    本压缩包"design-pattern(设计模式,包括创建型、结构型、行为型三大类共23种常见的设计模式和J2EE常见设计模式等).zip"提供了全面的设计模式学习资源,适用于初学者和有经验的开发者,帮助他们提升软件设计能力。...

    常见设计模式的解析和实现(C++、C#)

    总的来说,理解和掌握这些常见设计模式对于任何软件开发者来说都是至关重要的,无论是在C++还是C#的开发环境中,它们都能帮助我们编写出更优雅、更易于维护的代码。通过阅读和实践这些文档,开发者可以提升自己的...

    常见设计模式的解析和实现.rar

    这个压缩包文件"常见设计模式的解析和实现.rar"显然包含了关于设计模式的详细讲解和实例实现,旨在帮助开发者理解和应用这些模式。以下是设计模式的一些核心知识点: 1. **创建型模式**:这类模式主要涉及对象的...

    常见设计模式解析(带示例)

    本资源“常见设计模式解析(带示例)”包含了作者对于多种设计模式的深入理解和示例解释,主要以C++语言为实现背景。通过学习这些设计模式,开发者能够更好地理解和构建可维护、可扩展的代码。 首先,我们来看一下...

    常见设计模式图例(一图胜千言一图秒懂).zip

    在给定的压缩包文件“常见设计模式图例(一图胜千言一图秒懂)”中,包含了多个设计模式的可视化图例,帮助开发者直观理解这些模式的核心概念和应用。 1. **简单工厂模式**:这种模式是一种创建型设计模式,它提供一...

Global site tag (gtag.js) - Google Analytics