设计模式------工厂模式

来源:互联网 发布:数据库模型图多对多 编辑:程序博客网 时间:2024/05/16 19:35

本人喜欢从字面意思入手理解概念,关于工厂模式我查询了资料实在弄不懂它应和了工厂的什么特性才这样叫,目前来看有这样几种说法:

1、客户只负责使用,不关心工厂生产的细节。给工厂提供一个产品型号等信息,然后让工厂给你提供具体产品;

      类似于给工厂类传递参数,然后工厂类返回给你具体的对象;

      个人点评:java方法不都这样,你给一个方法提供一个参数,方法给你返回一个结果,你也不必关心过程;工厂类的这个特性真心不稀奇;

2、有个比喻说:一个老板有宝马、奔驰、奥迪三辆车,每次使用时他坐上宝马后跟司机说“开宝马”,坐上奔驰后“开 奔驰”,坐上奥迪时说“开奥迪”,老板坐上特定车后再跟司机说开特定车,太麻烦,所以工厂模式是为了解决这个问题而产生,使用工厂模式后老板可以直接说“开车”就行了;

      个人点评:可能是我个人理解习惯,反正这样说我更迷糊了;


关于工厂模式的好处,有各种语言表述:

*  工厂方法封装了对象创建的细节,将对象创建代码和其他部分脱离,减少相干性.

*  工厂模式的好处就是为系统结构提供灵活的动态扩展机制.减速少工作量,方便维护.

*  有利于同类对象创建的统一管理和控制你所关心的仅仅是工厂方法返回的接口方法,不必关心实现细节

*  工厂类一个用处就是尽量解耦合

*  还有就是利于系统的部署和连接数据库连接时的更换。因为不同的企业可能用不同的数据库。如果我们用三层架构的话就难拓展连接了

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我自己的理解:

工厂模式到底应和了工厂的什么特性?

答:传统的手工作坊制作服装,是一个人完成设计、选料、裁剪、缝纫、熨烫等一系列工作;而后期随着工业革命啥的,工厂化模块生产出现,一个人只负责其中的一项工作,比如只做设计,比如只做缝纫... ...大家都做自己最擅长的,然后协同产生高效率;

       我感觉java设计模式中的工厂模式就是应和了“模块化”,把一项功能给拆分给不同的类或方法实现;

       所以工厂模式的好处就是“解耦合”;

为什么工厂模式感觉这么抽象呢?理解起来这么难受呢?

答:因为工厂模式在java中实在是太常见了,我很纳闷有必要特别拎出来吗特别定义吗,我最初还以为工厂模式是其他比较新颖高大上的模式,所以总往新颖的方向想... ...汗一个... ...

    模块化可以应用于功能设计、应用于类逻辑、应用于方法组织...用的都是比较大的面,但此处却把模块化比较精细地应用于“创建对象”,可能为了醒目啥的特意给定义了名字“工厂模式”;

    工厂模式是为了降低“已经被实例化的对象在今后发生变动而修改”的成本而产生的;比如你们工厂就生产宝马、奔驰、奥迪等吃汽油的车,有一天突然有需求了说要生产新能源汽车,我去,这两款车差别有点大好嘛!!!只能硬着头皮生产了,但怎样用现有的生产汽油车的设备进行最节省经济的生产呢?

     应用工厂模式通过将生产过程进行最合理的模块化细化,尽量在原有基础上做最小的调整来完成需求变化,追求在现有资源基础上做最小变动来应对各种对象创建的变动;

     所以专门有一个类用来做创建实例的过程,这就是“工厂类”;而工厂模式不仅仅是工厂类,而是整套生产流程逻辑;


工厂模式结构

抽象类:public interface Car{ ... ...}

-------------------------------------------------

继承类:

public class Benz implements Car{... ...}

public class Bmw implements Car{... ...}

public class Audi implements Car{... ...}

----------------------------------------------------------------------------------------------------

public static Car driverCar(String s)throws Exception {

// 功能逻辑

       if(s.equalsIgnoreCase("Benz"))             return new Benz(); 
       else if(s.equalsIgnoreCase("Bmw"))     return new Bmw();

        ...... 

}

----------------------------------------------------------------------------------------------------

public class Magnate{ 
     public static void main(String[] args){ 
     try{ 

          Car car = Driver.driverCar("benz"); 

         servlet
          car.drive(); 

      }

}


这些东西在java中不是很常见吗,"action--java类--service--serviceImpl--具体的类"大体架构不也是这样;只是此处特意用于对象的创建;












 

0 0
原创粉丝点击