工厂方法模式 工厂模式用于实现逻辑的封装,并通过公共的忌口提供对象的实例化服务,在添加新类时只需要做少量的修改。 1. 静态工厂模式(简单工厂模式) ? 静态工厂属于创建者模式,静态工厂模式的实现需要三个角色 简单工厂:负责创建具体产品产品,工厂类的方法可以被外界直接调用 抽象产品:在 Java 中,抽象产品是由抽象类或者接口担任的,用以让具体产品继承或实现 工厂方法模式 工厂方法模式又称为多态性工厂模式,指定一个创建对象的接口,但由实现这个接口的类来决定实例化哪一个类。 ? 在工厂方法模式中,共涉及到4个角色: 抽象工厂角色:定义产品对象的产生 具体工厂角色:实现了抽象共产,负责具体产品的创建 抽象产品角色:定义具体产品的共性 具体产品角色:具体产品的实例 工厂方法模式示例 抽象工厂和工厂方法一样拥有四个对象: 抽象工厂:声明创建抽象产品对象的一个操作接口 具体工厂:实现创建具体产品对象的操作 抽象产品:为一类产品对象声明一个接口 具体产品:定义一个将被相应的具体工厂的创建的产品对象
上节我们最后 已经为首页打造好了vue的前置环境,本节开始正式写一个vue元素了。
工厂模式分三类: 简单工厂 工厂方法 抽象工厂 简单工厂不属于设计模式,因为其违背了设计模式的开闭原则,后面会有介绍。 工厂方法 ? 车可以生产车,那具体的奥迪车工厂可以生产奥迪车,奔驰车工厂可以生产奔驰的车。当需要生产法拉利的车时,我们只需要实现一个法拉利的产品,然后实现一个法拉利的工厂即可,而不需要修改之前的代码。 简单工厂 ? factory_simple.png 这是工厂模式的简单实现方式,包含元素 工厂类 抽象产品 抽象方法 示例 这里抽象产品和抽象方法和前面一样。 比如:当需要生产法拉利时,我们需要修改工厂类的方法。这不符合开闭原则,所以它不属于设计模式。只是工厂模式的一个变相简单的实现。 抽象工厂 前面说到工厂方法只能生产一个类型的产品。 当我们需要生产一系列的产品,比如:我们需要奥迪的发动机,那么肯定也是在奥迪的工厂生产,那么这里就可以使用抽象工厂设计模式 元素 抽象工厂 具体工厂 抽象产品(多个) 具体产品 示例 这里我们再Car的基础上在增加一个产品
文章目录 简单工厂 工厂方法 抽象工厂 简单工厂 ---- 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一 个工厂对象决定创建出哪一种产品类的实例。 printBlock(); if(i==3||i==5||i==7) System.out.println(); if(i==4| printBlock(); if(i==3||i==5||i==7) System.out.println(); if(i==4| 可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。 把工厂类抽象后,对应不同子类工厂(普通/魔法),生产对应的一组产品。 col;i++){ int tt = rd.nextInt(3); map.get(tt).printBlock(); if(i==4|
上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销。 Note :抽象工厂与工厂方法最大的区别就在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级中的产品对象的创建。 2.2 抽象工厂模式概述 抽象工厂模式为创建一组对象提供了一种方案,与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。 (4)Concrete Product (具体产品角色):定义具体工厂生产的具体产品对象,实现在抽象产品接口中声明的业务方法。 CreateButton(); ITextField CreateTextField(); IComboBox CreateComboBox(); } (4)
抽象工厂模式可以说是工厂方法模式的升级版,当需要创建的产品有多个产品族时使用抽象工厂模式是比较好的选择。一个产品由多个产品族构成,那什么是产品族呢? 4.与简单工厂和工厂方法模式的对比 简单工厂模式,一个工厂类根据入参的不同生产不同类型的产品。 工厂方法模式,一个具体工厂类生产一个具体类型的产品。不同具体类型的产品由不同具体工厂类生产。 抽象工厂模式,一个具体工厂类生产不同产品族的具体产品。不同产品族的产品组合由不同具体工厂类生产。 无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也极为相似,他们的最终目的都是为了解耦。 经常你会发现,明明使用的是工厂方法模式,当新需求来临,稍加修改,在抽象工厂类中加入一个新的生产产品方法后,由于抽象工厂类中的产品构成了不同抽象基类中具体产品,具体工厂类生产的产品组成了一个产品族,它就变成抽象工厂模式了
前言:按照惯例我以Head First设计模式的工厂模式例子开始编码学习。并由简单工厂,工厂模式,抽象工厂模式依次演变,归纳他们的相同与不同。 (静态工厂),简单工厂也可以不用静态类,但简单工厂并不是一种专门的设计模式(有时候可能会混淆,认为这即是”工厂模式“),更像是我们平时编程都会做的一种习惯。 工厂方法模式:定义了一个创建对象的接口,由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。 工厂方法与简单工厂的区别:工厂方法的子类看起来很像简单工厂。 利用抽象工厂我们代码将从实际工厂解耦,这样如果我们的工厂需要扩展那么我们则可在子类中进行修改扩展。 工厂方法与抽象工厂的异同优缺点 相同:都是用来创建对象。 不同:工厂方法使用的是继承,抽象工厂使用的是组合。 优点:工厂方法只负责从具体类型中解耦,抽象工厂适合将一群相关的产品集合起来。 缺点:抽象工厂扩展接口需要修改每个子类。
工厂模式分三类:简单工厂模式、工厂方法模式、抽象工厂模式。 首先介绍比较简单一种工厂模式——简单工厂模式。 我们以计算器作为一个例子来说明工厂模式到底是什么。 既然是工厂模式,那就有一个工厂类。这个工厂类是用来干嘛的呢?工厂是用来做什么呢?生产东西用的,工厂模式的工厂类就使用类生产不同类不同对象的。 ,只需要输入运算符号,工厂类就能实例化出合适的对象,通过多态返回父类的方式的实现了计算器的结果。 #到现在,就是简单工厂模式的思想,为什么不能几个if分支判断来实现计算器呢?那样岂不是代码量更少,好像更容易阅读么? 代码量少是在这里更少,但是如果考虑到扩展性,如果是一个大型项目,该需求或者做扩展的时候,我想付出代价远远比工厂模式这多出来的代码更大。
工厂模式之抽象工厂 是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。类继承自抽象工厂,即可生产指定对象。新增实体的时候无需修改已有代码。 比如食物这个工厂,在现实世界中,它可以生产面包、鸡蛋、肉等,在魔法世界中,食物工厂可以生产魔法豆、会唱歌的火鸡、HP口服液等,我们把食物比作是最大的一个抽象工厂,现实世界(ModernFactory)抽象工厂和魔法世界 (MagicFactory)抽象工厂继承自最大的食物抽象工厂,然而bread面包、egg鸡蛋、meat肉类都继承自ModernFactory抽象工厂、MagicBeans魔法豆等继承自MagicFactory ,一步步化抽象为具体,抽象工厂实际最大的好处就是实现了代码的解耦。 ,食物大类分为现实世界的面包和魔法世界的魔法豆,面包是由现实工厂生产的,魔法豆是由魔法工厂生产的,魔法豆一族和面包一族分别继承自食物,通过代码工厂就可以根据需求生产不同的食物(调用不同的方法)。
工厂模式的定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。 如 TCL 电视工厂、海信电视工厂等。 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。 客户不关心创建产品的细节,只关心产品的品牌 工厂模式的结构与实现 工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。本节来分析其基本结构和实现方法。 工厂模式的主要角色如下: -抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
今天主要是分析 简单工厂模式、工厂模式和抽象工厂模式的区别,所以这里就简单介绍一下设计模式的概念。 工厂方法模式的结构组成: 抽象工厂类厂(AbstractFactory):工厂方法模式的核心类,提供创建具体产品的接口,由具体工厂类实现。 4.应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。最好的情况是将该模式引入创建者类的现有层次结构中。 结构定义(类似工厂模式): 抽象工厂类厂(AbstractFactory):工厂方法模式的核心类,提供创建具体产品的接口,由具体工厂类实现。 4.由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。
客户端针对抽象工厂及抽象产品编程,产品的具体工厂和产品由具体工厂子类实现。这样,当系统需要引入新的产品时,只需增加相应的具体工厂和产品类即可,符合开闭原则。 二、简单工厂模式 简单工厂模式是最简单的工厂模式,它通过一个专门的类来负责创建其他类的实例,而不需要明确指定具体将要创建的类。这个专门的类称为“简单工厂类”或“工厂类”。 在实际应用中,如果需要频繁添加新的产品类型,可能会更倾向于使用抽象工厂模式或其他更灵活的工厂模式。 三、工厂方法模式 工厂方法模式是对简单工厂模式的进一步抽象化。 在工厂方法模式中,抽象工厂类负责定义创建产品对象的接口,而具体工厂类则负责实现具体的产品创建逻辑。 但是,与简单工厂模式相比,工厂方法模式需要定义更多的类,增加了系统的复杂度。 四、抽象工厂模式 抽象工厂模式是对工厂方法模式的进一步抽象化。
简单工厂 用一个类来实例类 1.一个计算器的类有两个属性,为number1和number2 2.一个virtual方法用来得到结果 3.在工厂类中根据用户的操作符类型决定具体实例化哪个类 用例: break; } } return null; } } 工厂模式 工厂模式将用一个类来对一个类实例化,这些实例化的类继承一个抽象的实例化类。 这种模式避免了简单工厂中的switch、case的情况,在具体需要实例一个类的时候,调用某一个类就可以 让一个类的实例化延迟到其子类。
译文出自:登链翻译计划[1] 译者:aisiji[2] 校对:Tiny 熊[3] 如何简单的在合约中部署合约并且尽可能的节省 gas 工厂设计模式[4]是编程中相当常见的模式。 为什么是工厂 让我们先讨论一下什么时候以及为什么你会想要一个工厂。让我们先看看什么时候不需要工厂: 你只在主网上部署一次合约,然后就不再部署了。 很明显,如果你只部署一次,工厂就没有意义。 一个简单的工厂 在最简单的情况下,你的工厂只是一个合约,它有一个函数用来部署你实际使用的合约。让我们来看一个修改过的MetaCoin[7]。 而合约越大,克隆工厂的部署在成本上不会有太大变化,但普通工厂的部署会越来越贵。 2] aisiji: https://learnblockchain.cn/people/3291 [3] Tiny 熊: https://learnblockchain.cn/people/15 [4]
也不再需要用一个超级工厂类来管理所有的实例生产过程。 比如现在工厂不仅需要生产 Color对象,还需要生产 Brush对象用来刷 Color,而每个颜色需要跟对应的刷子一起用。 implements Brush { void brush() { System.out.println("painting blue"); } } 颜色有了,刷子也有了,工厂可以开工 factory.createBrush(); //now we're painting paint(color, brush); 即使后来产品说要改需求,对于使用者来说,也只是简单修改一下使用者所使用的具体工厂类而已
我们先来看看“简单工厂模式”和“工厂方法模式”的类继承关系。上篇提到的“简单工厂模式”的类继承关系如下图所示: ? “工厂方法模式”的类继承关系如下图所示: ? 发现四个运算类分别有了各自的工厂类,这是为什么呢?我们先来实现代码。 运算符抽象类以及四个它的实现类不做任何变动,参照上篇。 由于多了四个工厂类,所以把工厂类抽象成一个工厂类接口。 { Operation createOperation(); } 加减乘除工厂分别实现这个工厂类接口,只举加法工厂类。 ,至于这两种工厂模式有什么区别,各自的优缺点是什么,我们在介绍了抽象工厂方法后再来做一个简单的总结。 多结合简单工厂模式,思考,为什么存在这两种模式,各自的意义又是什么。
一、简单工厂模式 常规设计:多个客户端对应一个创建产品类。一旦新增产品,每个客户端都需要修改,耦合性太高。 简 单工厂模式:客户与创建产品中添加一个工厂,创建对象都在工厂中,一旦新增产品,只需要修改工厂 二、工厂方法模式 抽象产品接口 具体产品类(实现抽象产品接口方法) 抽象工厂接口 具体工厂类(实现抽象产品接口及创建具体产品类 ) 中间件:聚合抽象工厂接口,接口调用具体工厂类方法创建具体产品 //抽象产品类 public interface IAbstractProduct { void typeProduct(); 3类就可以,将客户端new 产品1工厂替换成产品3工厂就可以,符合开闭原则。 新增品牌则只需要实现工厂接口类即可,然后IProductFactory factory = new newFactory();下面的代码都不用动。
java工厂模式分三种:简单工厂模式、工厂方法模式、抽象工厂模式。 简单工厂模式严重违背了“开闭原则”,难以拓展,由此产生了工厂方法模式。 工厂方法模式(FACTORY METHOD)是对简单工厂模式进行了抽象化,符合“开闭原则”,实现了可扩展。 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。 工厂方法模式使用场景: 如组装手机的代工厂。从手机原料工厂获取外壳、显示屏、主板、按键、电池等配件进行组装。 很多介绍工厂方法模式的都是将工厂模式的用法列出来,而并没有具体介绍何时使用。
简单工厂 *** 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是**由一 个工厂对象决定创建出哪一种产品类的实例**。定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。 [watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MDM0NzA4,size_ 类图: [watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MDM0NzA4,size [watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MDM0NzA4,size_ [watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MDM0NzA4,size_
本文主要对比一下简单工厂以及工厂方法在此情景需求下的实现方式。 一.简单工厂 概念:简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 图一:简单工厂模式的UML 二.工厂方法 概念:核心工厂类不再负责产品的创建,成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口。 图二:工厂方法模式的UML 通过对比我们可以发现: 1)简单工厂主要适合由工厂创造的“产品”(product)功能要求单一,而且区分界限明显【缺点:对工厂的方法开放‘修改’】 比如:计算器加减乘除运算仅返回一个 result(),由‘+、-、*、/’进行自动区分; 2)工厂方法适合工厂制造的product具有多功能,标准化工厂接口,具体产品由实现该接口的子工厂实现【缺点:将具体产品的生产“判断”抛出到了客户端,