首页 Java java教程 Java常用设计模式详解-工厂模式

Java常用设计模式详解-工厂模式

Dec 15, 2016 pm 01:42 PM
java 工厂模式

设计模式的原则:针对借口编程

工厂模式的作用:

         A.应用程序的设计中把对象的的创建集中在一个地方创建或者统一由某类来管理(spring)

         B.在不改动应用程序的基础上可以直接添加对象,同时也利于对象的维护。

工厂模式的种类:

         A.简单工厂

         B.工厂方法

         C.抽象工厂

楔子:

        话说东北某老板家里有三辆车,奔驰,宝马,蓝博基尼,雇了一名有经验的司机,不同的场合他会吩咐司机开不同的车应酬。

     简单工厂:

     abstruact:

               package com.product.abstruct;

            public interface Car {

                    public void drive();//车是用来开的,所以得有个发动机

               }

     implements:

             package com.product.implement;

             import com.product.abstruct.Car;

             public class Audi implements Car {

                 public void drive(){//宝马他也是车不是马,也得有发动机

                          // TODO Auto-generated method stub

                          System.out.println("yes,today wo are driving Audi。。。。");

                   }

               }

            

             package com.product.implement;

             import com.product.abstruct.Car;

             public class Benz implements Car {

             public void drive(){//奥迪他也是车不是迪奥,也得有发动机

                     // TODO Auto-generated method stub

                     System.out.println("yes,today wo are driving Benz。。。。");

                     System.out.println("老板,一些按照您的吩咐....");

                    }

               }

                 ======兰博基尼省======

    Factory类:

       factory类是一个管理类,是汽车的直接负责人,这个人就是老板的司机;

                package com.product.factory;

             import com.product.abstruct.Car;

             import com.product.implement.Audi;

             import com.product.implement.Benz;

             public class Driver {

                      public static Car driveCar(String carName) throws Exception{

                               if(carName.equalsIgnoreCase("Benz")){

                                       return new Benz();

                                 }

                                 if(carName.equalsIgnoreCase("bmw")){

                                        return new Bwm();

                                  }  

                                        return new Audi();

                               }

                     }

           某一天老板要去英格兰观看利物浦主场对阵维拉的比赛,需要开宝马去机场,于是把司机叫来,让他下午2点开宝马来接他。。。

                   package com.product.test;

              import com.product.abstruct.Car;

              import com.product.factory.Driver;

                    public class Test {

                           public static void main(String[] args) throws Exception{

                                   //tell the driver which car wo drive todaty wo will to Amsterdam

                                    Car car = Driver.driveCar("Benz");//让司机开车过来接

                                    //Mrs wang Go

                                   car.drive();//一键启动

                              }

                       }


           工厂方法:

         随着老板的生意越做越大,越来越有钱,于是乎他有买了几辆跑车----法拉利、保时捷、捷豹三部座驾,由于车两增加了,所有的汽车都要有老司机一个人管理,年检、保险、罚单、洗车,老司机一个人实在吃不消,而且老板会吩咐老司机从周一到周六要开不同款式的车外出,这个时候老司机就不得不记住老板哪天需要开哪辆车外出,于是乎给老板提议:给每台车都聘请一个司机,每辆汽车都有一个专门的人员负责,需要外出的时候招呼我一声,我就会派相应的人员过来接老板,老板毫不犹豫的说:就这么办.......

        抽象汽车类:

                    package com.product.car.abstruct;

                    public interface Car {

                            public void drive();

                     }

          奥迪汽车:

                     package com.product.car.implement;

                     import com.product.car.abstruct.Car;

                     public class AudiDriver implements Car  {

                           public void drive() {

  

                                System.out.println("想当官四个圈");

  

                            }

                      }

            奔驰汽车:

                     package com.product.car.implement;

                     import com.product.car.abstruct.Car;

                     public class AudiDriver implements Car {

                          public void drive() {


                                System.out.println("想当官四个圈");


                          }

                     }

             ======省略其他汽车======

             汽车总管(老司机)

 

                      package com.product.car.manager;

                      import com.product.car.abstruct.Car;

                      public interface CarManager {

 

                            public Car driveCar();

 

                       }

              新招聘的奥迪司机:

                       package com.product.car.managerImpl;

                       import com.product.car.abstruct.Car;

                       import com.product.car.implement.AudiDriver;

                       import com.product.car.manager.CarManager;

                      public class AudiManager implements CarManager {

                           public Car driveCar() {

  

                              return new AudiDriver();

  

                            }

                       }

             新招聘的奔驰司机:

                      package com.product.car.managerImpl;

                      import com.product.car.abstruct.Car;

                      import com.product.car.implement.BenzDriver;

                      import com.product.car.manager.CarManager;

                      public class BenzManager implements CarManager {

 

                           public Car driveCar(){

  

                                  return new BenzDriver();

  

                            }

                      }

             某天老板想去利物浦:

                       package com.product.test;

                       import com.product.car.abstruct.Car;

                       import com.product.car.implement.BenzDriver;

                       import com.product.car.manager.CarManager;

                       public class Test {

 

                           public static void main(String[] args) throws Exception{

                                   //找到汽车主管,告诉他今天我想开宝马去看利物浦对阵维拉的比赛

                                 CarManager carManager = (CarManager) new BenzDriver();

                                //负责宝马汽车的司机接到管家的电话,给宝马加满油,宝马来喽

                               Car driveCar = carManager.driveCar();

                                //飞奔利物浦

                               driveCar.drive();

                           }

                    }


 以上就是工厂模式中的简单工厂,工厂方法,先来比较一下这两种模式的却别以及各自的优势所在,

   程序设计角度:

       a.简单工厂没有抽象类,只有一个工厂类,把需要创建对象的参数传递过来,由工厂类统一创建

       b.定义一个创建产品对象的接口,该接口扮演这核心的角色,他只需要定义子类必须实现的方法即可,将对象交给对象本身来创建

   优势劣势:

       a.相对简单工厂工厂方法要更加的抽象,这样做的好处在于不改变工厂角色的基础上(不辞退老司机或者给他调岗)可以很轻松的增加新的成员(招聘更多的司机);

       b.简单工厂的优势在于简单,仅仅是根据参数来创建相应对象即可,但劣势也相当明显,所有的对象都集中在该类中创建,所创建的对象只能是事先就知道的(忽然有一天老板买来一辆手动挡捷达,老板就必须通知老司机,我买了一辆捷达,在X放着);成员对象的添加会引起核心类增加方法,违反高内聚,当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

接下来时工厂模式的应用,程序设计中我们如何合理的应用工厂设计模式呢

  a.对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。

 b.只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。



更多 Java常用设计模式详解-工厂模式相关文章请关注PHP中文网!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

公司安全软件导致应用无法运行?如何排查和解决? 公司安全软件导致应用无法运行?如何排查和解决? Apr 19, 2025 pm 04:51 PM

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

如何优雅地获取实体类变量名构建数据库查询条件? 如何优雅地获取实体类变量名构建数据库查询条件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

如何使用MapStruct简化系统对接中的字段映射问题? 如何使用MapStruct简化系统对接中的字段映射问题? Apr 19, 2025 pm 06:21 PM

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本启动Spring...

如何将姓名转换为数字以实现排序并保持群组中的一致性? 如何将姓名转换为数字以实现排序并保持群组中的一致性? Apr 19, 2025 pm 11:30 PM

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

Java对象如何安全地转换为数组? Java对象如何安全地转换为数组? Apr 19, 2025 pm 11:33 PM

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名构建查询条件? 使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名构建查询条件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名以构建查询条件,是一个常见的难题。本文将针...

电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? 电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? Apr 19, 2025 pm 11:27 PM

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

See all articles