• 技术文章 >Java >java教程

    java设计模式之工厂方法模式

    高洛峰高洛峰2017-01-19 16:16:05原创540
    概要

    设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。

    定义

    定义一个用于创建对象的接口,让其子类去决定实例化那个类

    使用场景

    任何使用复杂对象的地方,都可以使用工厂模式

    UML

    java设计模式之工厂方法模式

    1.抽象工厂

    抽象工厂:我们都知道,工厂,一般只有一个作用,那就生产,比如,吉利汽车厂,那就制造吉利汽车,iphone手机制造厂就造iphone等等
    所以可以用一个简单的方法概括,就是create();
    2.具体汽车制造厂

    具体汽车制造厂:实现了抽象工厂,具有实际的制造汽车的流程和方法等

    3.抽象汽车

    抽象汽车:汽车我们一般都知道,能跑,能放音乐,能导航,能转弯这些都是汽车的共性

    4.具体汽车

    抽象汽车:具体汽车实现了抽象汽车,具备其所有的功能,当然不同的汽车可能具备的功能还不一样

    上述简单的做了介绍,大体而言就是,具体汽车厂制造相应的的汽车,比如:奥迪的工厂,制造奥迪汽车,大众的工厂,制造大众的汽车等

    代码演示

    上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:

    (1)抽象汽车工厂

    package com.zengtao.demo.factory;
     
    /**
     * 抽象工厂
     */
    public abstract class CarFactory {
     
      public abstract <T extends Car> T createCar(Class<T> cla);
     
    }

    (2)具体汽车工厂

    package com.zengtao.demo.factory;
     
    /**
     * 奥迪工厂
     */
    public class AudiFactory extends CarFactory {
     
      @SuppressWarnings("unchecked")
      @Override
      public <T extends Car> T createCar(Class<T> cla) {
        Car car = null;
        try {
          car = (Car) Class.forName(cla.getName()).newInstance();
        } catch (Exception e) {
          e.printStackTrace();
        }
        return (T) car;
      }
     
    }

    (3)定义抽象的车

    package com.zengtao.demo.factory;
     
    public abstract class Car {
     
      public abstract void drive();
     
      public abstract void selfNagive();
     
      public abstract void playMusic();
     
    }

    (4)具体的车

    (奥迪q3)

    package com.zengtao.demo.factory;
     
    public class AudiQ3Car extends AudiCar {
     
      @Override
      public void drive() {
        System.out.println("AudiQ3Car 已经制造成功");
        System.out.println("AudiQ3Car drive");
      }
     
      @Override
      public void selfNagive() {
        System.out.println("AudiQ3Car selfNagive");
      }
     
      @Override
      public void playMusic() {
        System.out.println("AudiQ3Car playMusic");
        System.out.println("");
      }
    }

    (奥迪q5)

    package com.zengtao.demo.factory;
     
    public class AudiQ5Car extends AudiCar {
     
      @Override
      public void drive() {
        System.out.println("AudiQ5Car 已经制造成功");
        System.out.println("AudiQ5Car drive");
      }
     
      @Override
      public void selfNagive() {
        System.out.println("AudiQ5Car selfNagive");
      }
     
      @Override
      public void playMusic() {
        System.out.println("AudiQ5Car playMusic");
        System.out.println("");
      }
     
    }

    (5)调用

    package com.zengtao.demo;
     
    import com.zengtao.demo.factory.AudiFactory;
    import com.zengtao.demo.factory.AudiQ3Car;
    import com.zengtao.demo.factory.AudiQ5Car;
     
    public class Main {
     
      public static void main(String[] str) {
     
        // 创建工厂
        AudiFactory audiFactory = new AudiFactory();
     
        // 利用工厂制造q3车
        AudiQ3Car audiQ3Car = audiFactory.createCar(AudiQ3Car.class);
         // 利用工厂制造q5车
        AudiQ5Car audiQ5Car = audiFactory.createCar(AudiQ5Car.class);
     
        // 开始开车放音乐
        audiQ3Car.drive();
        audiQ3Car.playMusic();
     
        audiQ5Car.drive();
        audiQ5Car.playMusic();
     
      }
    }

    (6)结果

    java设计模式之工厂方法模式

    以上呢,就里用工厂方法模式,实现了制造汽车的简单过程

    第一点:

    在抽象工厂中我们看到,createCar(Class cla)方法,我们为什么这样定义呢,使用反射去的方式去创建具体的车,这样,我们不同类型的车,只需要相应的条件,是不是都能产出了,所以这样写是有好处的,就像很多,奥迪有q3,q5,a4,a6,a7,a8等系列一样

    第二点:

    如果我们有其它的车,比如宝马,也具有宝马x1,320,x5等,我们也可以很简单的实现,只需要实现抽象工厂,然后具体汽车实现抽象car就好了,扩展也非常方便

    总结

    抽象工厂到这里也就差不多了,工厂方法模式是一个比较简单也挺好的一种设计模式

    但是也有缺点,比如:如果有新的其它类型汽车,只需要实现抽象工厂和抽象汽车,也就新建两个类

    但是如果不是汽车,是手机,那么,就要全部都写一遍,这样就会造成,非常多的类出现,是否采用工厂方法模式,还是根据需求来决定。

    注意:大家也不要为了设计而去套用设计模式,当然工厂方法模式平时也很常用,比如:Activity的onCreate方法,我们也是根据自己定义的xml布局,加载生成相应的界面等等

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

    更多java设计模式之工厂方法模式相关文章请关注PHP中文网!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:初识Java设计模式适配器模式 下一篇:java设计模式之中介者模式
    大前端线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一招教你使用java快速创建Map(代码分享)• PlayFramework 完整实现一个APP(十一)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网