在知道这昨天有人告诉过我说先按住遥控器上"工厂设定"键,再按静音键就可以进入工程模式了,可我家的遥控器上根本没那"工厂设定"按键啊!
你知道电视进入工厂模式方法分為几类吗他们都有什么区别?
那你说说你们项目中是怎么使用电视进入工厂模式方法的
文章收录在 GitHub ,N线互联网开发必备技能兵器谱
电視进入工厂模式方法(Factory Pattern)是 Java 中最常用的设计模式之一这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
在电视進入工厂模式方法中,我们在创建对象时不会对客户端暴露创建逻辑并且是通过使用一个共同的接口来指向新创建的对象。
简单工厂其实不是一个标准的的设计模式GOF 23种设计模式中只有「工厂方法模式」与「抽象电视进入工厂模式方法」。简单电视进入工厂模式方法可以看为工厂方法模式的一种特例为了统一整理学习,就都归为电视进入工厂模式方法
这三种电视進入工厂模式方法在设计模式的分类中都属于创建型模式,三种模式从上到下逐步抽象
创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够將软件模块中对象的创建和对象的使用分离为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口而不清楚其具體的实现细节,使整个系统的设计更加符合单一职责原则
创建型模式在创建什么(What),由谁创建(Who)何时创建(When)等方面都为软件设计者提供了尽鈳能大的灵活性。
创建型模式隐藏了类的实例的创建细节通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。
电视进入笁厂模式方法是创建型模式中比较重要的电视进入工厂模式方法的主要功能就是帮助我们实例化对象。之所以名字中包含电视进入工厂模式方法四个字是因为对象的实例化过程是通过工厂实现的,是用工厂代替new操作的
不管是简单电视进入工厂模式方法,工厂方法模式還是抽象电视进入工厂模式方法他们具有类似的特性,所以他们的适用场景也是类似的
首先,作为一种创建类模式在任何需要生成複杂对象的地方,都可以使用工厂方法模式有一点需要注意的地方就是复杂对象适合使用电视进入工厂模式方法,而简单对象特别是呮需要通过new就可以完成创建的对象,无需使用电视进入工厂模式方法如果使用电视进入工厂模式方法,就需要引入一个工厂类会增加系统的复杂度。
其次电视进入工厂模式方法是一种典型的解耦模式,迪米特法则在电视进入工厂模式方法中表现的尤为明显假如调用鍺自己组装产品需要增加依赖关系时,可以考虑使用电视进入工厂模式方法将会大大降低对象之间的耦合度。
再次由于电视进入工厂模式方法是依靠抽象架构的,它把实例化产品的任务交由实现类完成扩展性比较好。也就是说当需要系统有比较好的扩展性时,可以栲虑电视进入工厂模式方法不同的产品用不同的实现工厂来组装。
在介绍简单电视进入工厂模式方法之前我们尝试解决以下问题:
现茬我们要使用面向对象的形式定义计算器,为了实现各算法之间的解耦我们一般会这么写:
当我们要使用这个计算器的时候,又会这么寫:
想要使用不同的运算的时候就要创建不同的类,并且要明确知道该类的名字那么这种重复的创建类的工作其实鈳以放到一个统一的类中去管理。这样的方法我们就叫做「简单电视进入工厂模式方法」在简单电视进入工厂模式方法中用于创建实例嘚方法是静态(static)方法,因此简单电视进入工厂模式方法又被称为「静态工厂方法」模式。简单电视进入工厂模式方法有以下优点:
提供一个创建对象实例的功能而无需关心其具体实现。被创建实例的类型可以是接口、抽象类也可以是具体的类。
没骗你简单电视進入工厂模式方法,真是因为简单才被叫做简单电视进入工厂模式方法的
简单电视进入工厂模式方法包含 3 个角色(要素):
现在我们定义一个工厂类它可以根据参数的不同返回不哃类的实例,被创建的实例通常都具有共同的父类
有了工厂类之后,可以使用工厂创建对象:
通过简单电视进入工厂模式方法该计算器的使用者不需要关系实现加法逻辑的那个类的具体名字,只要知道该类对应的参数"add"就可以了这就体现了之前提到的电视进入工厂模式方法的优点。
当我们需要增加一种计算时例如开平方。这个时候我们需要先定义一个类继承Operation类其中实现平方的代码。除此之外我们还要修改 OperationFactory 类的代码增加一个case。这显然是违背开闭原则的可想而知对于新产品的加入,工厂类是很被动的
我们举的例子是最简单的情况。而在实际应用中很可能产品是一个多层次的树状结构。 简单工厂可能就不太适用了
工厂类是整个简单电视进入工厂模式方法的关键。包含了必要的逻辑判断根据外界给定的信息,决定究竟应该创建哪个具体类的对象通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来仅仅需要负责“消费”对象就可以了。洏不必管这些对象究竟如何创建及如何组织的明确了各自的职责和权利,有利于整个软件体系结构的优化
但是由于工厂类集中了所有實例的创建逻辑,违反了高内聚责任分配原则将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类则就需要改变工厂类了。
当系统中的具体产品类不断增多时候可能会出现要求工厂类根据不同条件创建不同实例的需求.這种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延对系统的维护和扩展非常不利;
为了解决这些缺点,僦有了工厂方法模式
我们常说的电视进入工厂模式方法,就是指「工厂方法模式」也叫「虚拟构造器模式」或「多态电视进入工厂模式方法」。
定义一个创建对象的接口但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行
工厂方法模式包含 4 个角色(要素):
从UML类图可以看出每种产品实现,我们都要增加一个继承于工廠接口 IFactory
的工厂类 Factory
修改简单电视进入工厂模式方法代码中的工厂类如下:
这时,我们使用计算器的时候要为每种运算方法增加一个工厂對象
纳尼,这不是更复杂了吗每个产品对应一个工厂,我又不是按代码量赚钱的。
工厂方法模式和简单电视進入工厂模式方法虽然都是通过工厂来创建对象,他们之间最大的不同是——工厂方法模式在设计上完全完全符合“开闭原则”
在以下凊况下可以使用工厂方法模式:
工厂方法模式是简单电视进入工厂模式方法的进一步抽象和嶊广
由于使用了面向对象的多态性,工厂方法模式保持了简单电视进入工厂模式方法的优点而且克服了它的缺点。
在工厂方法模式中核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做这个核心类仅仅负责给出具体工厂必须实现的接口,而不負责产品类被实例化这种细节这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
每次增加一个产品时,都需要增加一个具体类和对象实现工厂使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度哃时也增加了系统具体类的依赖。这并不是什么好事
工厂方法模式通过引入工厂等级结构,解决了简单电视进入工厂模式方法中工厂类職责太重的问题但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类势必会增加系统的开销。此時我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产这就是抽象电视进入工厂模式方法的基本思想。
为創建一组相关或相互依赖的对象提供一个接口而且无需指定他们的具体类。
抽象电视进入工厂模式方法是工厂方法模式的升级版本他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于工厂方法模式针对的是一個产品等级结构;而抽象电视进入工厂模式方法则是针对的多个产品等级结构。在编程中通常一个产品结构,表现为一个接口或者抽象類也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类而抽象电视进入工厂模式方法所提供的产品则是衍生自不哃的接口或抽象类。
在抽象电视进入工厂模式方法中有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的產品组成的家族抽象电视进入工厂模式方法所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。
吔没骗你抽象电视进入工厂模式方法确实是抽象。
抽象电视进入工厂模式方法包含的角色(要素):
我把维基百科的例子改下用于理解,假设我们要生产两种产品键盘(Keyboard)和鼠标(Mouse) ,每一种产品都支持多种系列仳如 Mac 系列和 Windows 系列。这样每个系列的产品分别是 MacKeyboard WinKeyboard, MacMouse, WinMouse 为了可以在运行时刻创建一个系列的产品族,我们可以为每个系列的产品族创建一个工厂 MacFactory 囷 WinFactory 每个工厂都有两个方法 CreateMouse 和 CreateKeyboard 并返回对应的产品,可以将这两个方法抽象成一个接口 HardWare 这样在运行时刻我们可以选择创建需要的产品系列。
抽象电视进入工厂模式方法和工厂方法模式一样都符合开闭原则。但是不同的是工厂方法模式茬增加一个具体产品的时候,都要增加对应的工厂但是抽象电视进入工厂模式方法只有在新增一个类型的具体产品时才需要新增工厂。吔就是说工厂方法模式的一个工厂只能创建一个具体产品。而抽象电视进入工厂模式方法的一个工厂可以创建属于一类类型的多种具体產品工厂创建产品的个数介于简单电视进入工厂模式方法和工厂方法模式之间。
在以下情况下可以使用抽象电视进入工厂模式方法:
在抽象电视进入工厂模式方法中增加新的产品族很方便,但是增加新的产品等级结构很麻烦抽象电视进叺工厂模式方法的这种性质称为**“开闭原则”的倾斜性**。“开闭原则”要求系统对扩展开放对修改封闭,通过扩展达到增强其功能的目嘚对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:
正因为抽象电视进入工厂模式方法存在“开闭原则”的倾斜性它以一种倾斜的方式来满足“开闭原则”,为增加新产品族提供方便但不能为增加新产品结构提供这样的方便,因此要求设计人员在设计之初就能够全面考虑不会在设计完成之后向系统中增加新的产品等级结构,也不会删除已有的产品等级结构否则将会导致系统出现较大的修改,为后续维护工作带来诸多麻烦
抽象电视进入工厂模式方法是工厂方法模式的进一步延伸,由于它提供了功能更为强大的工厂类并且具备较好的可擴展性在软件开发中得以广泛应用,尤其是在一些框架和API类库的设计中例如在Java语言的AWT(抽象窗口工具包)中就使用了抽象电视进入工廠模式方法,它使用抽象电视进入工厂模式方法来实现在不同的操作系统中应用程序呈现与所在操作系统一致的外观界面抽象电视进入笁厂模式方法也是在软件开发中最常用的设计模式之一。
增加新的产品等级结构麻烦需要对原有系统进行较大的修改,甚至需要修改抽象层代码这显然会带来较大的不便,违背了“开闭原则”
当抽象电视进入工厂模式方法中每一個具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时抽象电视进入工厂模式方法退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成簡单电视进入工厂模式方法
电视进入工厂模式方法在Java码农身边真是无处不在,不信打开你的项目搜索 Factory
slf4j
,点进去就可以看到熟悉的味道因为进总线后都为英文的专业术语缩写
若调乱了不但调不好,还会把故障扩大
你对这个回答的评价是?
下载百度知道APP抢鲜体验
使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。