Java设计模式(创建型:工厂方法模式+抽象工厂模式)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式(创建型:工厂方法模式+抽象工厂模式)相关的知识,希望对你有一定的参考价值。

设计模式根据目的准则可以分为三类:

  1. 创建型:creational 创建型的设计模式与对象的创建有关。

  2. 结构型:Structural 处理类和对象之间的组合。

  3. 行为型:behavioral 描述类和对象如何交互及如何分配职责。

厂方法模式

站在使用者的角度,工厂方法模式是指使用者提出想要实现的具体功能或者说是想要生产的具体的东西的要求,在通过工厂制造之后就将该东西或功能交付给使用者。使用者并不知道实现的具体过程,只是做了要求提出以及实现的结果的使用。

严谨来说工厂方法模式(Factory Method)也叫工厂模式,属于类创建型模式,工厂父类(接口)负责定义产品对象的公共接口,而子类工厂则负责创建具体的产品对象。

目的:是为了把产品的实例化操作延迟到子类工厂中完成,通过工厂子类来决定究竟应该实例化哪一个产品具体对象

有四部分组成:

1. 抽象工厂角色:具体工厂必须实现的接口或必须继承的父类。一般由抽象类或接口实现。

2. 具体工厂角色:是具体应用程序调用以创建对应的具体产品的对象。一般它由具体的类来实现。

3. 抽象产品角色:具体产品继承的父类或实现的接口。一般由抽象类或接口实现。

4. 具体产品角色:具体工厂角色所创建的对象就是它的实例。一般由具体类实现。

通过实例来区分工厂方法模式的四部分及运用。

实例:boss提出发送消息给员工

public class FactoryMethod{

   /**

    * 定义公共的接口send

    */

   interface Send {

       void send();

   }

  

   /**

    * 定义具体工厂角色,继承公共接口

    */

   class SmsFactory implements Send{

 

       @Override

       public void send() {

          // TODO 自动生成的方法存根

          System.out.println("通过短信发送消息");

       }

      

   }

  

   class MailFactory implements Send{

 

       @Override

       public void send() {

          // TODO 自动生成的方法存根

          System.out.println("通过E—mail发送消息");

         

       }

      

   }

   /**

    * 将使用者所指定的方式与子工厂匹配,利用工厂实现

    *

    */

   class Factory{

       public void method(String a){

         

          if ("sms".equals(a)){new SmsFactory().send();}

          else if("email".equals(a)){new MailFactory().send();}

          else

              System.out.print("输入错误");

         

       }

   }

   /**

    * 定义使用者

    */

   public static void main(String args[]){

       FactoryMethod temp=new FactoryMethod();

       Factory temp1=temp.new Factory();

       temp1.method("sms");

       temp1.method("email");

   }

}

输出为:通过短信发送消息

通过E—mail发送消息

抽象工厂模式

抽象工厂模式其实就是在工厂方法模式的基础上抽象出来了一部分。在工厂方法模式中,发送消息的两种方式是在类Factory中进行匹配然后调用相关的具体工厂执行,假如此时需要增加另一种方式发送消息,则需要将类Factory全部暴露给程序员,这种情况下是非常危险的。因此,应该将调用具体工厂的方式抽象出来,使得每一种工厂都有自己的调用方法,抽象出创建Create这个接口,每种调用方式均继承这个接口,当需要增减发送方式的时候,只需要将这个接口抛出来,实现了低耦合,提高了安全性。

代码如下:

package factory_method;

 

public class AbstractFactory{

      /**

       * 定义公共接口Send

       */

      interface Send {

             void send();

      }

     

      /**

       * 定义具体工厂角色,继承抽象工厂角色

       */

      class SmsFactory implements Send{

 

             @Override

             public void send() {

                    // TODO 自动生成的方法存根

                    System.out.println("通过短信发送消息");

             }

            

      }

     

      class MailFactory implements Send{

 

             @Override

             public void send() {

                    // TODO 自动生成的方法存根

                    System.out.println("通过E—mail发送消息");

                   

             }

            

      }

      /**

       * 创建新的接口Create,调用具体工厂的每个方式都有其自己的类

       *

       */

      interface Create{

             void method();

            

      }

      class SmsMethod implements Create{

 

             @Override

             public void method() {

                    // TODO 自动生成的方法存根

                    new SmsFactory().send();

             }

            

      }

      class MailMethod implements Create{

 

             @Override

             public void method() {

                    // TODO 自动生成的方法存根

                    new MailFactory().send();

             }

            

      }

      /**

       * 定义使用者

       */

      public static void main(String args[]){

             AbstractFactory temp=new AbstractFactory();

             temp.new SmsMethod().method();;

             temp.new MailMethod().method();

      }

}

 总结

工厂方法模式和抽象工厂模式都属于工厂模式,最终目的都是为了降低耦合度,不必过于纠结是属于哪种模式,在条件允许的情况下,能抽象出共同的接口就尽量抽象出来,能更方便的维护和扩展程序。

以上是关于Java设计模式(创建型:工厂方法模式+抽象工厂模式)的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式--创建型模式

详解Java工厂模式(抽象工厂/简单工厂/工厂方法)

JAVA设计模式 3创建型理解工厂模式与抽象工厂模式

设计模式才是Java灵魂,Java创建型模式的抽象工厂模式

PHP设计模式之工厂模式

6创建型模式之工厂模式与抽象工厂模式