博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工厂模式家族
阅读量:5799 次
发布时间:2019-06-18

本文共 1479 字,大约阅读时间需要 4 分钟。

工厂模式主要是为创建对象提供一个接口,通常在类或类的静态方法中去实现。工厂模式家族中主要有这三个成员:简单工厂模式,工厂方法模式和抽象工厂模式。

一、简单工厂模式

简单工厂模式,是指专门创建一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类,它又称为静态工厂方法模式。它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品继承一个父类或接口)的实例。

简单工厂模式,顾名思义是工厂模式家族中最简单实用的模式。从下面计算器的结构图当中我们就能看出来了!

换句话来说,就相当于是自己独立的创建了一个工厂,而在这个工厂是用来具体生产出某种东西(也就是对类的实例),用户用这个工厂的时候,只需要发送命令即可(即是加法还是减法等命令)而无需知道它是怎么生产出来的。也就是说,你让这个工厂生产出什么,它就生产出个具体的模型出来给你。

二、工厂方法模式

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

例如,我们要生产苹果、橙子、葡萄等水果,如果只有一个工厂就不能满足要求,我们需要另外的苹果厂,橙子厂,葡萄厂等,需要苹果时,就调用苹果厂进行生产。但是,不管是苹果厂,还是橙子厂,总之是工厂就行了。这样我们就将它们统一抽象为水果厂。下面是工厂方法模式的结构图:

工厂方法模式 PK 简单工厂:

简单工厂的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类。对于客户端来说,去除了与具体产品的依赖。

而工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的。也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。如果要增加功能,我们只需要修改客户端就OK了!工厂方法模式的优点主要是实现了开放—封闭原则,在不改变工厂的前提下增加新产品。

三、抽象工厂模式

抽象工厂模式(Abstrate Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

结构图:

换句话说,当我们希望得到的是一系列的对象而不仅仅是单个对象的时候,我们就可以使用抽象工厂模式了。

抽象工厂模式,主要是针对不同的产品等级结构,例如上面的结构图,ConceteFactory1 生产出来的产品是ProductA1和ProductB1这一组产品。而ConcreteFactory2生产出来的是ProductA2和ProductB2这组产品。

而工厂方法模式针对的一个产品等级结构,在工厂方法模式的抽象基类中,只有一个子类,抽象工厂模式却有多个,并且每个子类之间都有相互关联和依赖关系。

抽象工厂模式好处:

第一,易于交换产品系列,由于具体工厂类,在一个应用中只需要再初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同得到产品配置。

第二它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

简单工厂模式、工厂方法模式和抽象工厂模式都属于设计模式的创建型模式,各有优缺点,具体使用哪种模式,根据不同的情况进行选择。

posted on
2013-03-25 21:59 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/mingxuanyun/archive/2013/03/25/3084222.html

你可能感兴趣的文章
使用Python读Excel数据Insert到MySQL
查看>>
heartbeat搭建高可用NFS
查看>>
Nginx工作原理和优化、漏洞。
查看>>
Spring Boot之使用JPA操作mysql
查看>>
Spring <context:annotation-config/>解析
查看>>
独立博客的几点建议:必须找准定位,不要太SEO
查看>>
总结:线程间频繁切换为什么耗费资源?
查看>>
加入域 找不到网络路径
查看>>
好久没写日志了,
查看>>
高可用之添加群集功能(Hyper-V)
查看>>
MySQL主从安装步骤
查看>>
×××虚拟专用网—gre配置
查看>>
EPG服务器关于TTL的BUG
查看>>
Hive的动态分区
查看>>
exception 'CALayerInvalidGeometry', reason:
查看>>
Cookie 和 Session总结
查看>>
独立显卡的本本温度过高为什么怎么解决
查看>>
Java 服务器端修改apk并重新打包签名
查看>>
使用 jQuery Mobile 和 CSS3 实现响应式设计
查看>>
如何获得高质量的外链
查看>>