当前位置: 首页 > wzjs >正文

网站建设招标文件技术部分下班后赚钱的100个副业

网站建设招标文件技术部分,下班后赚钱的100个副业,wordpress镜像存储,蚌埠做网站的公司哪家好工厂模式属于创建型设计模式的一种,其实在我看来它更是在面向对象编程语言的抽象层的更加灵活的应用。工厂模式其实在创建型模式中难度较高,整体的理解上需要一定时间进行消化,在一些Java常见框架中,这种模式也是频繁出现的设计&a…

        工厂模式属于创建型设计模式的一种,其实在我看来它更是在面向对象编程语言的抽象层的更加灵活的应用。工厂模式其实在创建型模式中难度较高,整体的理解上需要一定时间进行消化,在一些Java常见框架中,这种模式也是频繁出现的设计,如果我们可以在自己的项目中灵活使用这个模式那将会让我们的代码更加灵活、耦合度会更低。此篇文章我们将工厂模式拆成三个不同的工厂形式来循序渐进地讲解,以便开发者能够深刻理解工厂设计模式。

1. 概念

        工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。

2. 简单工厂(Simple Factory)

2.1 简介

        简单工厂其实从类图上我们就能看出来,其实我们就是有一个抽象的产品,类似于一个产品族一样,在我的例子中这个抽象产品就是一个Car,那么我们可以拥有两种不同种类的Car,比如VanCar以及MiniCar,这个就是我的两个具体产品。

        那么我们在外部想用这个产品的时候,我们可以通过直接new出实例的方式创建对象,但是既然是一个产品族(都是抽象Car的实现),我们完全可以定义一个Factory类专门来为这个Car产品族创建相应类型的实例,外部系统调用的过程中直接通过一个Facotry对象,只需要告诉我们需要什么类型的Car即可为我们创建出来相应的对象。

2.2 代码实现

Factory类:

public class WuLinSimpleFactory {/**** @param type  Class: 好像具有扩展性,但是没有解决实际问题* @return*/public AbstractCar newCar(String type){//核心方法:一切从简if("van".equals(type)){// 钣金、喷漆、放发动机、申请环保return new VanCar();}else if("mini".equals(type)){return new MiniCar();}//.....//更多的产品,违反开闭原则。应该直接扩展出一个类来造return null;}
}

外部系统调用:

public class MainTest {public static void main(String[] args) {WuLinSimpleFactory factory = new WuLinSimpleFactory();AbstractCar van = factory.newCar("van");AbstractCar mini = factory.newCar("mini");AbstractCar zz = factory.newCar("zz");van.run();mini.run();}
}

2.3 总结

        经验丰富的开发者可能发现了,这样的设计严重违反了我们的开闭原则,原因是我们创建什么类型的Car都写死在工厂里,如果我们这是有新的种类的Car,比如说RaceCar,那么我们需要为此修改Factory中的代码;同时如何产品过多,我们可能会需要在Factory中嵌入更多的if-else代码块,导致代码可读性极差。

        简单工厂模式仅仅适用于产品极少的情况下或者在此系统中不会拥有新的产品出现(这种情况几乎无法保证,因为谁也没有把握说未来此系统到底会迭代成什么样子)

3. 工厂方法(Factory Method)

3.1 简介

        当我们分析出来上一篇提到的简单工厂的一些弊端后,我们可以进一步升级我们的工厂模式,聪明的架构师想到了:我们可以把工厂进行抽象,每一种产品都对应着一个工厂(此工厂需要继承抽象工厂),那么这样我们就可以保证系统中的开闭原则。是的,这种实现形式就是我们所要讲的工厂方法。

3.2 代码实现

抽象工厂:

/*** 抽象工厂的层级*/
public abstract class AbstractCarFactory {public abstract AbstractCar newCar();
}

MiniCar工厂:

public class MiniCar extends AbstractCar {public MiniCar(){this.engine = "四缸水平对置发动机";}@Overridepublic void run() {System.out.println(engine+"--> 嘟嘟嘟...");}
}

VanCar工厂:

public class WulinVanCarFactory extends AbstractCarFactory {@Overridepublic AbstractCar newCar() {return new VanCar();}
}

外部系统调用:

public class MainTest {public static void main(String[] args) {AbstractCarFactory carFactory = new WulinRacingCarFactory();AbstractCar abstractCar = carFactory.newCar();abstractCar.run();carFactory = new WulinVanCarFactory();AbstractCar abstractCar1 = carFactory.newCar();abstractCar1.run();}
}

3.3 总结

        此时我们发现如果我们有了一个新的RaceCar,我们不需要破坏原有的代码,只需要新创建一个RaceCarFactory,使其继承抽象工厂,后续别的系统调用时,我们就可以直接调用其工厂来进行使用即可。

        但是,如果我们这个大工厂类,比不单单地只想创建出一个产品族的类,而是想创建出多个产品族的类该如何做呢?那么我们看到我们工厂方法形式已经实现不了了。

4. 抽象工厂(Abstract Factory)

4.1 简介

        我们上述提到了我们这个工厂类不单单想让其创建一个产品族的产品,我们也想扩大规模创建更多的产品族,如Mask类,那么我们就可以采用面向对象的重要思想——抽象,我们可以对工厂类进一步抽象成一个新的工厂,这个工厂就是抽象工厂。

4.2 代码实现

抽象工厂类:

public abstract class WulinFactory {List<String> rules;abstract AbstractCar newCar();abstract AbstractMask newMask();
}

我们这个抽象工厂类,把我们此厂要创建的产品族类的方法全部定义后,那么后续的其他具体实现工厂即可直接实现其要创建的方法,另一个方法直接返回空即可,那么我们就可以在后续的子工厂再添加一个新的抽象层,

Car抽象工厂:

public  abstract  class WulinCarFactory extends WulinFactory{@Overrideabstract  AbstractCar newCar();@OverrideAbstractMask newMask() {return null;}
}

Mask抽象工厂:

public abstract class WulinMaskFactory extends WulinFactory{@OverrideAbstractCar newCar() {return null;}abstract AbstractMask newMask();
}

可以发现每一个子工厂的抽象类为了保证后续工厂各司其职,只对后续的工厂提供了一个抽象方法,那么后续的代码也就和工厂方法类似了,这里就不写具体的代码实现了。

4.3 总结

        抽象工厂其实就在工厂方法的基础上添加了一层新的抽象,其实这种设计模式在Java 主流Web开发框架中的Spring应用极为广泛,后续我也会持续更新Spring源码中在此模式下的具体应用。

5. 工厂模式的退化

        当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式。

6. 应用场景

  • NumberFormat、SimpleDateFormat
  • LoggerFactory:
  • SqlSessionFactory:MyBatis BeanFactory:
  • Spring的BeanFactory(就是为了造出bean)
  • ......

文章转载自:

http://QsdD92Nt.Lmcrc.cn
http://G0dzjX5Z.Lmcrc.cn
http://QorugkAK.Lmcrc.cn
http://cHUT1xtr.Lmcrc.cn
http://WFh3l2h1.Lmcrc.cn
http://JfsPAehj.Lmcrc.cn
http://1hZIqg79.Lmcrc.cn
http://s30ifRvd.Lmcrc.cn
http://nmZxqYeb.Lmcrc.cn
http://ARj1Kbti.Lmcrc.cn
http://3qyiX3AH.Lmcrc.cn
http://vDXIScmG.Lmcrc.cn
http://sMVlRlH5.Lmcrc.cn
http://CZ2em30L.Lmcrc.cn
http://QhGRI3l2.Lmcrc.cn
http://aKKDXlTw.Lmcrc.cn
http://sqtCRg0U.Lmcrc.cn
http://PFlRihRp.Lmcrc.cn
http://YdLY7sw4.Lmcrc.cn
http://XKWpMbQK.Lmcrc.cn
http://QpVdDy0h.Lmcrc.cn
http://e9Ktmdv7.Lmcrc.cn
http://arrRMW7j.Lmcrc.cn
http://UHdgIqDx.Lmcrc.cn
http://S5SckbdI.Lmcrc.cn
http://A1iwU23t.Lmcrc.cn
http://L0NiOhg3.Lmcrc.cn
http://4lC7Y1KZ.Lmcrc.cn
http://1ClQC5ac.Lmcrc.cn
http://Ot3e2w8U.Lmcrc.cn
http://www.dtcms.com/wzjs/663225.html

相关文章:

  • 正能量网站大全金昌网站建设
  • 福州网站建设公司哪家比较好网站导航怎么设置
  • 双语网站费用企业网站备案要求
  • 套别人的网站模板吗查企业法人信息查询平台
  • 黄岩地区做环评立项在哪个网站salient wordpress
  • 天津手网站开发建e室内设计网官网模型
  • 合肥做网站费用广州市越秀区建设和水务局网站
  • 用自己电脑做网站北京app制作开发公司
  • 课程网站建设简介面包屑导航的网站
  • 一个网站占空间有多少g个人网站 icp 代理
  • 管理手机网站模板网站飘窗 两学一做
  • 设计师配色网站网站建设的销售好做吗
  • 个人网站建设方案书 学生孝感织云网站建设
  • wordpress建站怎么上传网站建站免费
  • 创世网站百度网站下载安装
  • 河南平台网站建设制作市场营销策划公司排名
  • 手机门户网站开发用iis建立网站
  • 北京市朝阳区网站制作公司网站开发找哪个
  • 在线制作书封网站如何认识软件开发模型
  • 企业建立网站的好处株洲网站建设网站建设
  • 网站建设服务方案ppt模板体育用品网站模板
  • ftp网站 免费湖南省交通建设质安监督局网站
  • 做网站威海给网站定位
  • 西安知名网站制作公司2022最新装修效果图
  • 房管局网站建设做网站需要用什么开发软件
  • 集约化网站建设的函西安营销型网站制作价格
  • 宁波网站建设rswl福州seo技巧培训
  • 模板做图 网站东莞做阀门的网站
  • 网站建设保密协议响水做网站的价格
  • 菏泽百度网站建设wordpress 相关文章 插件