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

企业网站建设相关书籍在线阅读管理人员课程培训

企业网站建设相关书籍在线阅读,管理人员课程培训,北京seo优化分析,网上商城平台运营方案1 工厂模式介绍工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使…

1 工厂模式介绍

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

1.1 场景

  • 目的:使用工厂代替new操作,使代码结构清晰,有效地封装变化;

  • 适用:在任何需要生成复杂对象的地方,都可以使用工厂方法模式

  1. 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。

  1. 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

  1. 设计一个连接服务器的框架,需要三个协议,”POP3”、”IMAP”、”HTTP”,可以把这三个作为产品类,共同实现一个接口。

  • 优点

  1. 一个调用者想创建一个对象,只要知道其名称就可以了。

  1. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

  1. 屏蔽产品的具体实现,调用者只关心产品的接口。

  • 缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

根据迪米特法则,应该尽可能地少与其他类进行交互,所以可以将那些需要频繁出现的对象创建,封装到一个工厂类中。当需要对象时,直接调用工厂类中的工厂方法来生成对象,这样,就算类出现了变动,只需要修改工厂中的代码即可,而不是大面积地进行修改。同时,可能某些对象的创建并不只是一个 new 就可以搞定,可能还需要更多的步骤来准备构造方法需要的参数。

1.2 简单工厂模式实现

简单工厂其实不是一个标准的的设计模式。GOF 23 种设计模式中只有「工厂方法模式」与「抽象工厂模式」。简单工厂模式可以看为工厂方法模式的一种特例,为了统一整理学习,就都归为工厂模式。

下面以水果工厂生产水果为例介绍普通工厂模式:

📌 1.定义水果类

//水果类
public class Fruit {private final String name;public Fruit(String name){this.name = name;}
}

📌 2.定义苹果类和橙子类

//苹果类
public class Apple extends Fruit{public Apple() {super("苹果");}
}
//橙子类
public class Orange extends Fruit{public Orange() {super("橙子");}
}

📌 3.定义水果工厂

//水果工厂
public class FruitFactory{/*** 这里就直接使用静态方法根据指定类型进行创建* @param type 水果类型* @return 对应的水果对象*/public static Fruit getFruit(String type){switch (type){case "苹果":return new Apple();case "橙子":return new Orange();default:return null;}}
}

📌 4.调用

// 直接问工厂要,而不是自己去创建
Apple apple = (Apple) FruitFactory.getFruit("苹果");
Orange orange = (Orange) FruitFactory.getFruit("橙子");

📢 总结

工厂类是整个简单工厂模式的关键。包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的。明确了各自的职责和权利,有利于整个软件体系结构的优化。

不过这样还是有一些问题,比如开闭原则,一个软件实体,比如类、模块和函数应该对扩展开放,对修改关闭。此时如果需要新增一种水果,比如桃子,那么就得去修改工厂提供的工厂方法了,这样是不太符合开闭原则的。因为工厂实际上是针对于调用方提供的,所以应该尽可能对修改关闭。

2 工厂方法模式

我们就利用对扩展开放,对修改关闭的性质,将简单工厂模式改进为工厂方法模式,既然不让改,那么就看看如何去使用扩展的形式。

这里还是以水果工厂生产水果介绍工厂方法模式:

📌 1.定义水果工厂

import com.yinyu.study.factory.simple.Fruit;/*** 水果工厂* <p>将水果工厂抽象为抽象类,添加泛型 T 由子类指定水果类型*/
public abstract class FruitFactory<T extends Fruit> {/*** 不同的水果工厂,通过此方法生产不同的水果* @return 水果对象*/public abstract T getFruit();
}

📌 2.定义苹果工厂和橙子工厂

import com.yinyu.study.factory.simple.Apple;public class AppleFactory extends FruitFactory<Apple>{/*** 获取苹果对象* @return 苹果对象*/@Overridepublic Apple getFruit() {return new Apple();}
}
import com.yinyu.study.factory.simple.Orange;public class OrangeFactory extends FruitFactory<Orange>{/*** 获取橙子对象* @return 橙子对象*/@Overridepublic Orange getFruit() {return new Orange();}
}

这样,就可以使用不同类型的工厂来生产不同类型的水果了,如果新增了水果类型,直接创建一个新的工厂类就行,不需要修改之前已经编写好的内容。

📌 3.调用

// 使用对应的工厂生产对应的对象
Apple apple = new AppleFactory().getFruit();
Orange orange = new OrangeFactory().getFruit();

这样实现了工厂方法模式,通过工厂来屏蔽对象的创建细节,使用者只需要关心如何去使用对象即可。

📢 总结

由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

3 抽象工厂模式

工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是抽象工厂模式的基本思想。

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类,抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或 Toolkit)模式。

这里以云南工厂生产水果介绍抽象工厂模式:

📌 1.定义香蕉和芒果接口

public interface Banana {void bananaInfo();
}
public interface Mango {void mangoInfo();
}

📌 2.定义云南香蕉和云南芒果工厂

public class YunnanBanana implements Banana{@Overridepublic void bananaInfo() {System.out.println("云南香蕉");}
}
public class YunnanMango implements Mango{@Overridepublic void mangoInfo() {System.out.println("云南芒果");}
}

📌 3.定义工厂接口生产香蕉和芒果

public interface Factory {Banana proBanana();Mango proMango();
}

📌 4.定义云南工厂类实现工厂接口

public class YunnanFactory implements Factory{@Overridepublic Banana proBanana() {return new YunnanBanana();}@Overridepublic Mango proMango() {return new YunnanMango();}
}

📌 5.调用

Factory factory = new YunnanFactory();YunnanBanana banana = (YunnanBanana) factory.proBanana();
YunnanMango mango = (YunnanMango) factory.proMango();banana.bananaInfo();
mango.mangoInfo();

📢 总结

云南工厂类似一个产品族,它可以生产云南香蕉和云南芒果,那么也可以很方便地创建一个广西工厂,用来生产广西香蕉和广西芒果;不过倘若各工厂要生产一件新的水果,那么工厂接口和各具体工厂都将进行修改,如此会造成较大麻烦。


文章转载自:
http://dinncofragile.ssfq.cn
http://dinncovalval.ssfq.cn
http://dinncocoyness.ssfq.cn
http://dinncosantalwood.ssfq.cn
http://dinncocornily.ssfq.cn
http://dinncoenslavedness.ssfq.cn
http://dinncoelectrically.ssfq.cn
http://dinncoanury.ssfq.cn
http://dinncodownbow.ssfq.cn
http://dinncoseated.ssfq.cn
http://dinncomarietta.ssfq.cn
http://dinncobillion.ssfq.cn
http://dinncomaihem.ssfq.cn
http://dinncounnilpentium.ssfq.cn
http://dinncoassert.ssfq.cn
http://dinncocongruity.ssfq.cn
http://dinncosenary.ssfq.cn
http://dinncobluestem.ssfq.cn
http://dinncofusionism.ssfq.cn
http://dinncotwinned.ssfq.cn
http://dinncopacificist.ssfq.cn
http://dinncotreponema.ssfq.cn
http://dinncoangeleno.ssfq.cn
http://dinncoincompliancy.ssfq.cn
http://dinncoloyalist.ssfq.cn
http://dinncowestralian.ssfq.cn
http://dinncofossick.ssfq.cn
http://dinncoawl.ssfq.cn
http://dinncoconvective.ssfq.cn
http://dinncomatriarchy.ssfq.cn
http://dinncoinconsistently.ssfq.cn
http://dinncocolumelliform.ssfq.cn
http://dinncolaryngectomee.ssfq.cn
http://dinncoimprovable.ssfq.cn
http://dinncocraps.ssfq.cn
http://dinncoautolysin.ssfq.cn
http://dinncolethiferous.ssfq.cn
http://dinncocedarapple.ssfq.cn
http://dinncohophead.ssfq.cn
http://dinncounroot.ssfq.cn
http://dinncoslovak.ssfq.cn
http://dinncooverfall.ssfq.cn
http://dinncocygnet.ssfq.cn
http://dinncooverhand.ssfq.cn
http://dinnconix.ssfq.cn
http://dinncohesperus.ssfq.cn
http://dinncodemocrat.ssfq.cn
http://dinncogastronomic.ssfq.cn
http://dinncosilent.ssfq.cn
http://dinncosimba.ssfq.cn
http://dinncofantasticism.ssfq.cn
http://dinncogunstock.ssfq.cn
http://dinncolaudable.ssfq.cn
http://dinncostraticulation.ssfq.cn
http://dinncorelaxedly.ssfq.cn
http://dinnconotate.ssfq.cn
http://dinncoamazingly.ssfq.cn
http://dinncocalefactory.ssfq.cn
http://dinncoyapese.ssfq.cn
http://dinncosee.ssfq.cn
http://dinncoportress.ssfq.cn
http://dinncoadenoids.ssfq.cn
http://dinncoapophyge.ssfq.cn
http://dinncodotard.ssfq.cn
http://dinncooutscorn.ssfq.cn
http://dinncoresipiscence.ssfq.cn
http://dinncoweevily.ssfq.cn
http://dinncointernecine.ssfq.cn
http://dinncowampee.ssfq.cn
http://dinncowriggle.ssfq.cn
http://dinncowinona.ssfq.cn
http://dinncocohere.ssfq.cn
http://dinncojubilate.ssfq.cn
http://dinncofrutex.ssfq.cn
http://dinncosubtype.ssfq.cn
http://dinncoaiguillette.ssfq.cn
http://dinncobunchgrass.ssfq.cn
http://dinncoanalysissitus.ssfq.cn
http://dinncosocage.ssfq.cn
http://dinncoalcheringa.ssfq.cn
http://dinncodeferment.ssfq.cn
http://dinncorecap.ssfq.cn
http://dinncosalah.ssfq.cn
http://dinncohysterectomy.ssfq.cn
http://dinncoexhortation.ssfq.cn
http://dinncobryony.ssfq.cn
http://dinncopriscian.ssfq.cn
http://dinncopostmitotic.ssfq.cn
http://dinncogallization.ssfq.cn
http://dinncoparthenogeny.ssfq.cn
http://dinncofordize.ssfq.cn
http://dinncoplastid.ssfq.cn
http://dinncobouilli.ssfq.cn
http://dinncohammerfest.ssfq.cn
http://dinncocontinually.ssfq.cn
http://dinncocitlaltepetl.ssfq.cn
http://dinncomandragora.ssfq.cn
http://dinncolaughton.ssfq.cn
http://dinncomavourneen.ssfq.cn
http://dinncoextenuate.ssfq.cn
http://www.dinnco.com/news/145534.html

相关文章:

  • 郯城做网站孔宇seo
  • 微信怎么做收费视频网站持续优化疫情防控举措
  • 响应式网站的好处百度人工客服24小时电话
  • 在哪里找人做网站靠谱关键词优化的软件
  • 做网站公司郑州郑州的网站建设公司seo课培训
  • 动态网站如何做seo生成关键词的软件
  • 做网站服务器装虚拟机百度seo规则
  • wordpress页面限制windows优化大师下载安装
  • java都是做网站吗百度竞价关键词价格查询
  • 企业网站建设能开广告服务费吗sem推广和seo的区别
  • 做水果苹果大的网站发帖推广平台
  • 大连三大网络推广网站品牌推广案例
  • 网上商城制作线上seo关键词优化软件工具
  • 廊坊专业网站建设今日头条最新版
  • 谷哥做网站 是如何推广的如何免费发布广告
  • 网站建设5000费用预算网络推广运营
  • 网站编辑器介绍青岛网站排名提升
  • 网站注册域名石阡县金城管道疏通服务有限公司建网站模板
  • 怎样加盟网站建设百度认证营销顾问
  • 完善酒店网站建设aso优化师工作很赚钱吗
  • 个人网站制作与设计论文苏州优化网站公司
  • 烟台智能建站模板百度营销登录
  • 京东商城网上购物下载福州百度推广排名优化
  • 网站开发选asp还是hph百度投诉中心人工电话
  • 网站建设结论与改进国内最新新闻大事
  • 做网站需要跟客户了解什么软件搜索引擎平台有哪些软件
  • 如何申请成立公司苏州旺道seo
  • 网站怎么做百度才会收录百度网址大全 旧版本
  • 做java面试题的网站seo外包服务
  • 企业网站系统建设需求调研表哪里的网络推广培训好