简介

工厂设计模式在java中有大量的应用,如spring框架,这种类型的设计模式属于创建型模式。在工厂设计模式中,创建逻辑不会对客户端暴露,可以通过一个对外接口创建所需对象。

工厂模式使用场景

需要频繁创建对象且这些对象多处使用,业务发生改变需要修改多处代码,使用工厂模式即可进行代码解耦,业务改变修改时只需修改工厂部分代码

简单工厂模式

1.抽象一个对象,定义共性内容

/*** 将购商场象为一个接口*/
public interface IMarket {/*** 商品的接口*/void goods();/***** 商场京东、淘宝、拼多多,各个商场有各自的商品*/
}

2.创建具体实现类,实现自己特有内容

/*** 京东商场*/
public class JdMarket implements IMarket {/*** 具体实现京东的商品*/@Overridepublic void goods() {System.out.println("这是京东的商品");}
}/*** 拼多多商场*/
public class PddMarket implements IMarket {/*** 具体实现PDD的商品*/@Overridepublic void goods() {System.out.println("这是拼多多的商品");}
}/*** 淘宝商场*/
public class TbMarket implements IMarket {/*** 具体实现TB的商品*/@Overridepublic void goods() {System.out.println("这是淘宝的商品");}
}

3.创建工厂,定义通过类型获取对应产品对象的方法

/*** 获取商场的工厂类*/
public class SimpleFactory {/*** 根据Type获取相应的商场* @param type 商场类型* @return 对应商场*/public static IMarket getMarket(String type) {switch (type) {case "JD":return new JdMarket();case "TB":return new TbMarket();case "PDD":return new PddMarket();default:return null;}}
}

测试结果

public class SimpleFactoryTestMain {public static void main(String[] args) {// 此处传入京东,获取京东商场IMarket market = SimpleFactory.getMarket("JD");market.goods();}
}

 总结

简单工厂就是将对象抽象,定义共性内容,创建具体实现类。然后创建一个工厂,通过传入不同类型,创建对应对象。在一定程度上解耦代码。未来产品发生变化时,一定程度上减少修改工作量。但是在新增对象时需要修改工厂内部逻辑,对象过多时增加了系统逻辑复杂度,不利于未来的扩展和维护。

工厂方法模式

对简单工厂模式进一步抽象定义,使得可以在不修改工厂逻辑的情况下,可以拓展添加新的对象。

抽象工厂类,创建工厂接口,抽象定义获取对象的接口。

/*** 抽象定义工厂*/
public interface IMarketFactory {/*** 定义获取商场的接口* @return 具体商场对象*/IMarket getMarket();
}

定义具体工厂类,实现抽象工厂接口,实现获取对象的方法,由具体的工厂创建对应的对象

/*** 具体实现京东商场工厂*/
public class JdMarketFactory implements IMarketFactory {/*** 实现获取商场对象的方法* @return 京东商场*/@Overridepublic IMarket getMarket() {return new JdMarket();}
}/*** 拼多多商场工厂具体实现*/
public class PddMarketFactory implements IMarketFactory {/*** 实现获取商场对象的方法* @return 拼多多对象*/@Overridepublic IMarket getMarket() {return new PddMarket();}
}/*** 实现淘宝商场工厂*/
public class TbMarketFactory implements IMarketFactory {/*** 实现获取商场对象的方法* @return 淘宝商场对象*/@Overridepublic IMarket getMarket() {return new TbMarket();}
}

测试结果

public class FactoryMethodTestMain {public static void main(String[] args) {// 获取京东商场对象JdMarketFactory jdMarketFactory = new JdMarketFactory();IMarket market = jdMarketFactory.getMarket();market.goods();// 获取淘宝商场对象TbMarketFactory tbMarketFactory = new TbMarketFactory();IMarket tbMarket = tbMarketFactory.getMarket();tbMarket.goods();}
}

总结

工厂方法模式的优点是具备更高的复用性和可读性,可以在不需要修改工厂逻辑的情况下可以创建新的对象。缺点是需要创建很多的工厂,当类型很多的时候,需要创建的工厂类就很多。

抽象工厂模式

在工厂方法模式中,工厂能创建的对象类型太过单一,例如一个商场,有批发类型的商场,也有零售的商场,如果使用工厂方法模式,那么我们就需要创建两个工厂来进行生产对应类型的对象。经过时间发展后,假设又有了新的营销模式,如网销,直播销售的方式等,又得创建更多的工厂来进行生产对应的对象。那么如果将工厂继续抽象,在工厂中定义创建对象的接口,然后由具体的子工厂实现具体创建那种对象。这样,工厂就可以生产多种类型的对象,便于未来的维护与拓展。

1.创建抽象工厂

/*** 定义抽象工厂* 通过抽象工厂定义可以创建的各种类型,比如零售类和批发类*/
public interface IAbstractFactory {/**** 创建零售类的商场* @return 零售类商场*/IRetailMarket makeRetailMarket();/*** 创建批发类的商场* @return 批发类商场*/IWholesalMarket makeWholesalMarket();
}

2.创建具体实现的工厂

/*** 定义京东商场类工厂,京东商场工厂实现抽象工厂,即可创建对应功能的对象*/
public class JdMarketFactory implements IAbstractFactory {/*** 创建京东零售商场对象* @return 京东零售商场对象*/@Overridepublic IRetailMarket makeRetailMarket() {return new JdRetailMarket();}/*** 创建京东批发商场对象* @return 京东批发商场对象*/@Overridepublic IWholesalMarket makeWholesalMarket() {return new JdWholesalMarket();}
}/*** 创建淘宝商场工厂类*/
public class TbMarketFactory implements IAbstractFactory {/*** 创建淘宝零售商场对象* @return 淘宝零售商场对象*/@Overridepublic IRetailMarket makeRetailMarket() {return new TbRetailMarket();}/*** 创建淘宝批发商场对象* @return 淘宝批发商场对象*/@Overridepublic IWholesalMarket makeWholesalMarket() {return new TbWholesalMarket();}
}

测试结果

public class AbsFactoryTestMain {public static void main(String[] args) {// 创建京东商场工厂,IAbstractFactory jdMarketFactory = new JdMarketFactory();// 通过jd工厂创建出京东零售商场与京东批发商场IRetailMarket jdRetailMarket = jdMarketFactory.makeRetailMarket();IWholesalMarket jdWholesalMarket = jdMarketFactory.makeWholesalMarket();jdRetailMarket.retail();jdWholesalMarket.wholesal();System.out.println("----------------------分割线---------------------");// 创建淘宝商场工厂IAbstractFactory tbMarketFactory = new TbMarketFactory();// 通过淘宝商场工厂创建淘宝零售商场与淘宝批发商场IWholesalMarket tbWholesalMarket = tbMarketFactory.makeWholesalMarket();IRetailMarket tbRetailMarket = tbMarketFactory.makeRetailMarket();tbRetailMarket.retail();tbWholesalMarket.wholesal();}
}

总结

将工厂进一步封装成抽象工厂,定义各类工厂可以创建的对象类型,使工厂可以创建的类型不再单一,在实际应用中可以将相关的功能整合成一个功能线。开发时使得代码可读性与可维护性提高,同时可以快捷的使用各种封装好的功能。

Java 工厂设计模式相关推荐

  1. Java工厂设计模式

    工厂设计模式 一.面向对象的设计原则 1.1 OCP(开闭原则,Open-Closed Principle) 1.2 DIP(依赖倒转原则,Dependence Inversion Principle ...

  2. java工厂设计模式(适合新人)

    设计模式最常用的就是单例和工厂模式,单例的话主要是面试中会经常遇到,而工厂实际应用比较多,面试出现的几率也不小,话不多说,开始今天的课程. 1,什么是工厂设计模式 个人理解:工厂设计模式可以理解为一个 ...

  3. JAVA工厂设计模式——肯德基订餐

    一 模式定义 抽象工厂模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类. 抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只 ...

  4. 工厂设计 java,java 工厂设计模式

    一.简单工厂模式 简单工厂模式就是创建一个工厂类,对实现同一个接口的类进行实例化.其UML图如下: package com.hs.pattern.factory; public interface S ...

  5. Java工厂设计模式(简单计算器实现)

    总体的目录结构如下 1.基础工厂类 public interface BaseFactory {} 2.拓展工厂类 public class OperationFactoryimplements Ba ...

  6. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  7. Java设计模式(四):工厂设计模式

    1. 工厂设计模式 1.1 应用场景 由于需求的变化,一个类的子类经常面临着剧烈的变化,但他却拥有比较稳定的接口.使用一种封装机制来"隔离这种易变对象的变化",工厂方法定义一个用于 ...

  8. 简单工厂和 工厂设计模式--抽象工厂模式--Java实现

    简单工厂不是23种设计模式 工厂方法·模式 :定义一个创建对象得接口,但是让实现这个接口的类来决定实例化哪一个类,工厂方法能使得类的实例化推迟到子类中进行 工厂方法缺点: 增加了类的数量,增加复杂度 ...

  9. java 工厂模式的写法_设计模式-Java-简单工厂模式--BitmapFactory

    上一篇,我们说了下MonkeyLei:设计模式-Java-观察者模式-RxJava 其中还利用到了反射的知识,另外也附上了很多我觉得分析还可以的链接. 这里我们看看简单工厂这块.除了这个还有其他几个: ...

最新文章

  1. python可以自学吗-python自学行吗
  2. Linux基础——linux和gcc的介绍
  3. word中光标选择一列文字_Word中文字排版对齐很难?只因你没掌握这几招排版技巧!...
  4. Floyed-Warshall算法
  5. 100篇精选算法技术文章收藏
  6. C语言变长数组 struct中char data[0]的用法
  7. springboot 定时器
  8. 用计算机来弹一首少年,辽宁省锦州市2018年中考语文试卷(word版,含答案)
  9. python入门——P40类和对象:一些相关的BIF
  10. lua io.read()
  11. 嵌入式linux clion,跨平台IDE集成开发环境Clion教程:嵌入式开发
  12. 论文写不出来,导师放养,严重焦虑,怎么办?
  13. 堆排序python代码实现_八大排序算法的python实现(五)堆排序
  14. 北京“曼联梦剧场”项目开业,迎接中国球迷与家庭
  15. 计算机网络(第七版)谢希仁
  16. 星环科技多模型数据统一存储的大数据分布式存储平台方案分享
  17. 园区IP地址规划(非常详细)
  18. 循环冗余校验码中冗余码的计算
  19. MapGISK9安装
  20. 用devc++表白_【民大表白墙】表白七号楼332进门右面下铺哥哥的第四天。你再不来,我要下雪了。云雀叫了一整天。...

热门文章

  1. PDF文件打印不清楚怎么办?
  2. 数据中台各种架构图大全
  3. vue+海康威视视频插件坑点记录
  4. 笑不死算你命大了 逗你开心的笑话
  5. Android 收发彩信(MMS)
  6. 计算机 检测三维球状表面的算法,三维形状计测,3-D height measurement,音标,读音,翻译,英文例句,英语词典...
  7. 最全的盲埋孔板工艺介绍与设计原则​​​​​​​
  8. 周易六十四卦——水风井卦
  9. 【ADS867x】14 位 500kSPS 4/8 通道 ADC 简介及驱动应用示例
  10. python 实现QQ群接龙统计未接龙成员名单