目录

工厂方法模式(Factory Method)

抽象工厂模式(Abstract Factory)

Spring 的 IOC(依赖注入),用的就是工厂模式;Spring 的 AOP (面向切面编程),用的就是动态代理模式。

工厂方法模式(Factory Method)

1、《简单工厂模式》有一个问题是“类的创建依赖工厂类,如果想要拓展程序,必须对工厂类进行修改”,这违背了闭包原则,所以从设计角度考虑,有一定的问题。

2、如何解决这个问题?就有了本节的工厂方法模式,创建一个工厂接口和多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

3、下面开始实现上图的结构,Sender(发件人)接口如下:

package com.lct.factoryMethod;
/*** Created by Administrator on 2019/4/7.* 发件人*/
public interface Sender {/*** 发送消息** @param message*/void send(String message);
}

4、实现类 MailSender、SmsSender 如下:

package com.lct.factoryMethod;import java.util.logging.Logger;
/*** Created by Administrator on 2019/4/7.* 邮件发送者*/
public class MailSender implements Sender {protected MailSender() {}@Overridepublic void send(String message) {Logger logger = Logger.getAnonymousLogger();logger.info(message);}
}
package com.lct.factoryMethod;import java.util.logging.Logger;
/*** Created by Administrator on 2019/4/7.* 短信发送者*/
public class SmsSender implements Sender {protected SmsSender() {}@Overridepublic void send(String message) {Logger logger = Logger.getAnonymousLogger();logger.info(message);}
}

5、工厂接口 Provider 如下:

package com.lct.factoryMethod;
/*** Created by Administrator on 2019/4/7.* 供应商工厂接口*/
public interface Provider {Sender produce();
}

6、两个工厂类 SmsFactory、MailFactory 如下:

package com.lct.factoryMethod;/*** Created by Administrator on 2019/4/7.* 工厂接口实现类*/
public class MailFactory implements Provider {@Overridepublic Sender produce() {return new MailSender();}
}
package com.lct.factoryMethod;/*** Created by Administrator on 2019/4/7.* 工厂接口实现类*/
public class SmsFactory implements Provider {@Overridepublic Sender produce() {return new SmsSender();}
}

7、测试如下:

package com.lct.test;import com.lct.factoryMethod.MailFactory;
import com.lct.factoryMethod.Provider;
import com.lct.factoryMethod.Sender;
import com.lct.factoryMethod.SmsFactory;/*** Created by Administrator on 2019/4/7.*/
public class Test {public static void main(String[] args) {Provider mailFactory = new MailFactory();Provider smsFactory = new SmsFactory();Sender sender_mail = mailFactory.produce();Sender sender_sms = smsFactory.produce();sender_sms.send("今日高温红色预警.");sender_mail.send("点击链接激活邮件.");}
}

这个模式的好处就是拓展性较好!比如果现在想增加一个功能:发及时信息,则只需做一个实现类,实现 Sender 接口,同时做一个工厂类,实现 Provider 接口,就 OK 了,无需去改动现成的代码。

抽象工厂模式(Abstract Factory)

1、 工厂方法模式特点:

1)一个抽象产品类,可以派生出多个具体产品类。如上面的 Sender 与 MailSender、SmsSender

2)一个抽象工厂类,可以派生出多个具体工厂类。如上面的 Provider 与 MailFactory、SmsFactory

3)每个具体工厂类只能创建一个具体产品类的实例。

2、抽象工厂模式特点:

1)多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

2)一个抽象工厂类,可以派生出多个具体工厂类。

3)每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。

3、工厂方法模式 VS 抽象工厂模式:

1)工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

2)工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

3)工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。

4)抽象工厂需要创建一系列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。

4、对于 java 来说,见到的大部分抽象工厂模式是这样的: 它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。

5、举个例子:

比如说工厂可以生产鼠标和键盘,那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。

这样A和B就是工厂,对应于抽象工厂,每个工厂生产的鼠标和键盘就是产品,对应于工厂方法。

用了工厂方法模式,替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,只要换家工厂,就可以同时替换鼠标和键盘一套。如果需要要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)

6、所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线。

具体可以参考:http://www.runoob.com/design-pattern/abstract-factory-pattern.html

Java 设计模式 之 工厂方法模式、抽象工厂模式相关推荐

  1. 设计模式:工厂方法与抽象工厂模式

    说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别. 原文链接:http://blog.csdn.net/yzxz/article/details/4601152 抽象工厂模式与 ...

  2. java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752我们一起学Java! 在前面的学习中(参见前面的博客),我们学到了很 ...

  3. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  4. Android工厂设计模式(简单工厂,工厂方法,抽象工厂,BitmapFactory简单工厂分析,Retrofit抽象工厂分析)

    文章目录 创建型设计模式(简单工厂,工厂方法,抽象工厂) 一.简单工厂模式 引出简单工厂模式 二.工厂方法模式 三.抽象工厂模式 Android源码中用到的工厂模式举例 一.BitmapFactory ...

  5. 设计模式——简单工厂、工厂方法和抽象工厂的区别与联系

    前言 创建型模式中,常用的有工厂方法模式和抽象工厂模式,平时实践还包括简单工厂模式,虽然简单工厂模式不在23种设计模式中. 为了区分以上几种设计模式的差别,通过以下几个例子介绍这几种模式的使用场景以及 ...

  6. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  7. 【设计模式实战】简单工厂、工厂方法、抽象工厂:原理篇

    小明开发的应用,经常要从XML或者Asset中读取省市区数据. 小明是这样写的: public abstract class IOHandler {/*** 添加*/public abstract v ...

  8. 23招做项目——工厂模式:工厂方法和抽象工厂

    在网上的大多数资料里面,将工厂模式分为:简单工厂.工厂方法.抽象工厂,他们之间的联系(以电子厂为例)如下: 那么该文章首先讲解工厂模式是什么,为什么需要工厂模式,最后再对三种模式进行示例.该文章是23 ...

  9. 每周一个设计模式之工厂方法与抽象工厂

    工厂方法模式与抽象工厂模式,两个模式比较相似,把任何一个独立出来,好像都不太好,所以把它们放到一起来理解会更好.不管是工厂方法还是抽象工厂,都有三个要素,那就是Client,Factory,Produ ...

  10. 工厂模式(简单工厂,工厂方法,抽象工厂)

    工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂.该模式用于封装和管理对象的创建,是一种创建型模式. 1)简单工厂 该模式通过向工厂传递类型来指定要创建的对象 提供一个方法,根据类 ...

最新文章

  1. oracle websp,探索Web2.0成就SP 2.0之路
  2. objective-c如何在linux下进入Modern模式
  3. Java还能热多久?学Java有前途吗?
  4. C++coin change 硬币找零(附完整源码)
  5. JavaScript闭包函数的理解与使用
  6. Js里面IF(var)表示什么意思?js中if的写法、含义
  7. 信息学奥赛一本通 1159:斐波那契数列
  8. 企业签名打包错误+[MICodeSigningVerifier _validateSignatureAndCopyInfoForURL:withOptions:error:]:...
  9. java ajax传值到后台_java ajax发送数据到后台,中文乱码
  10. android 编译c代码吗,在Android手机上编译C代码
  11. 点聚-weboffice 6.0 (一)
  12. mysql 05_MySQL 05
  13. 璞华hawkeye点巡检设备平台系统
  14. 当当网商品详情API接口(当当商品详情接口,当当商品问答接口,当当抢购价接口,当当商品列表接口,当当商品评论接口)代码对接教程
  15. CHD 常用web端口
  16. 统计套利之平稳性检验
  17. kubernetes容灾备份工具velero
  18. 【CSS】固定区域竖向滚动
  19. 土地资源管理就业怎么这么难_土地资源管理就业前景怎么样
  20. python 字典列表,元组列表 列表嵌套字典 列表嵌套元组 字典嵌套列表

热门文章

  1. 计算机术语翻译的最烂,我国计算机名词的翻译现状和建议
  2. 拓端tecdat|R语言异方差回归模型建模:用误差方差解释异方差
  3. 拓端tecdat|r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现
  4. grafa导出数据图标_第5章 数据与可视化 - Grafana与数据可视化 - 《Prometheus操作指南》 - 书栈网 · BookStack...
  5. 实验三 函数的最值与导数
  6. ui uview 安卓开发_HarmonyOS 2.0手机开发者Beta公测招募
  7. MNIST数据集格式ubyte转png
  8. 简单神经网络结构一键可视化
  9. 基于Python开发用于钞票认证的神经网络
  10. python模拟栈的操作实现非递归方式的快速排序算法