工程模式和抽象工厂模式

您是否需要一种非常快速的方法来制作Factory对象? 然后,您需要lambda或其他函数传递! 它不仅快速,而且非常简单。 我敢打赌,如果您对Lambdas相当满意,那么您只需阅读标题就可以做到这一点。 如果您是其中之一,请坚持; 你永远不知道你能学到什么。

附带说明:我正在用Java和Python做代码示例。 为什么? 因为我喜欢这两种语言,所以为这两种语言放东西肯定不会受到伤害。

工厂模式入门

如果您已经知道什么是工厂设计模式,则可以跳到下一部分。

Factory模式的重点是为对象和方法提供一种实例化对象的方法,而无需暴露所有(或通常是任何一种 )实例化逻辑(需要将什么传递到构造函数中)。

举一个愚蠢的例子,假设有一类“ Scientist ,它需要一种方法来产生新的Pen来写下实验数据,但是他不想被创建过程所困扰。 为此,您将为Scientist一个PenFactoryScientist只需知道按一下工厂的按钮即可获得新的笔。

PenFactory是一个简单的对象,只有一个create()方法,该方法在您每次调用Pen时都会提供一个新的Pen实例。 如果Scientist关心Pen颜色,则可以为他提供ColoredPenFactoryColoredPenFactorycreate()方法也接受颜色参数。 然后, ColoredPenFactory必须弄清楚如何为该笔提供这种颜色。

扩展工厂模式理念

Factory Pattern是面向对象代码的一种模式,因此仅限于OO的工作方式,但是我们可以利用其目的并尝试找到一种以功能方式使其实现的方法,这实际上使它成为了很多更轻松。

实际上,由于缺乏传递功能的能力而创建了许多OO设计模式。 这些中的大多数都可以简单地通过传递函数来替换。 其中的简短列表包括命令,工厂和策略。 如果其他许多人接受函数,则可以删除许多类层次结构。 其中一些包括模板和访客。

因此,最大的区别是工厂类不必是一个类。 它也可以是简单的“可调用”。 因此,让我们深入研究一些示例。

OO笔厂

这样您就可以看到经典的OO模式和新的功能模式之间的区别,这里是OO Java中的示例类和接口。

public interface Pen {void write(String toWrite);boolean outOfInk();
}public interface PenFactory {Pen create();
}public class Scientist {private PenFactory penerator;private Pen pen;public Scientist(PenFactory penerator) {this.penerator = penerator;this.pen = penerator.create();}public void writeData(String data) {if(pen.outOfInk()) {pen = penerator.create();}pen.write(data);}
}

在OO Python中

class Pen(metaclass=ABCMeta):def write(self, text):passdef out_of_ink(self):passclass PenFactory(metaclass=ABCMeta):def create(self):passclass Scientist():def __init__(self, pen_factory):self.penerator = pen_factoryself.pen = self.penerator.create()def write_data(self, data):if self.pen.out_of_ink():pen = self.penerator.create()pen.write(data)

您是否了解我如何称呼PenFactory实例penerator ? 我认为这有点愚蠢。 希望您也喜欢。 如果没有,哦。

转换为简单的功能模式

当涉及到Java版本时,由于PenFactory视为功能接口,因此实际上不需要进行任何更改,但是由于您可以用Supplier<Pen>替换PenFactory任何实例, PenFactory不需要它。 因此, Scientist类看起来像这样:

public class Scientist {private Supplier penerator;private Pen pen;public Scientist(Supplier penerator) {this.penerator = penerator;this.pen = penerator.get();}public void writeData(String data) {if(pen.outOfInk()) {pen = penerator.get();}pen.write(data);}
}

在Python中,您可以完全删除PenFactory而只需使用返回Pen任何可调用对象即可。 您还必须在“ Scientist中更改调用工厂的create()方法的行,并仅用括号将其替换即可。

class Scientist():def __init__(self, pen_factory):self.penerator = pen_factoryself.pen = self.penerator()def write_report(self, data):if self.pen.out_of_ink():self.pen = self.penerator()self.pen.write(data)

因此,要创建带有提供MyPenClass实例的lambda的Scientist实例,请在Java中键入以下内容:

Scientist albert = new Scientist(() -> new MyPenClass());

或在Python中:

albert = Scientist(lambda: MyPenClass())
# or skip the lambda by passing the "constructor"
thomas = Scientist(MyPenClass)

具有依赖关系的类的工厂

假设我想为一个类的工厂制造工厂,该类的构造函数需要一个笔品牌的名称。 我们将此类BrandPen 。 我们将如何为之建立工厂? 好吧,写lambda并没有什么不同,真的。 但是,我们如何看待其他定义传入的可调用对象的方式呢?

在Java中,您可以将lambda的实例保存在变量中并传递给它。或者您可以使用方法引用:

Supplier bicPen = () -> new BrandPen("BiC");
Scientist thomas = new Scientist(bicPen);
// assuming that BrandPen has a static method called bicPen
Scientist nicola = new Scientist(BrandPen::bicPen);

在Python中,您可以定义一个执行该功能的函数或分配一个partial函数来执行此操作:

def bic_pen():return BrandPen("BiC")
# or
bic_pen = partial(BrandPen, "BiC")nicola = Scientist(bic_pen)

有依存关系的工厂

哦,天哪, Scientist现在希望能够指定工厂提供的笔的颜色 ! 好吧,您可以为他提供每种颜色的不同工厂,并告诉他使用每个不同的工厂来制造不同的笔,但是在他的实验室中根本没有足够的空间容纳这么多PenFactory ! 我们必须给工厂提供可以使用哪种颜色的信息。

为此,我们必须将Java的Supplier<Pen>更改为Function<>Color, Pen> 。 显然,您无需在Python中更改类型,因为它是动态的并且不需要类型信息。

但是, Scientist班也需要改变他们使用工厂的方式。 在Java中,无论Scientist在哪里请求新实例,都需要提供颜色,如下所示:

pen = penerator.apply(Color.RED);

或者像这样,在Python中:

self.pen = self.penerator(Color.RED)

我们传递给Java Scientist的工厂看起来像这样:

Scientist erwin = new Scientist(color -> new ColoredPen(color, "BiC"));

我们在Python中提供的代码如下所示:

def colored_bic_pen(color):return ColoredPen(color, "BiC")erwin = Scientist(colored_bic_pen)

多方法工厂

在Internet上“工厂模式”的一些示例中,它们显示了具有多种方法来调用生成对象的工厂。 我还没有在现实生活中看到这种效果,但是可能会发生。 在这些情况下,最好坚持使用OO选项,但是如果要将其更改为功能模式,只需提供单独的工厂可调用对象,而不是使用多个方法的一个对象即可。

奥托罗

我没想到会写那么多,但是随着我的前进,我想展示太多的小差异。 我没有了解所有内容,主要是因为我不想跟踪所有内容,尤其是两种语言,但是我敢肯定,我给了您足够的工具箱,可以在您的计算机上弄清楚它们拥有。

我希望你学到了一些东西。 如果没有,我希望您至少喜欢这个例子。

翻译自: https://www.javacodegeeks.com/2015/02/functional-factory-pattern.html

工程模式和抽象工厂模式

工程模式和抽象工厂模式_功能工厂模式相关推荐

  1. 设计模式 工厂方法_使用工厂方法模式设计最佳实践

    设计模式 工厂方法 在前面的"设计模式"示例中,我们解释了当今常用的"工厂"模式. 在本节中,我们将了解具有更多抽象的更高级的解决方案. 该模式称为工厂方法设计 ...

  2. 长安渝北工厂机器人_长安工厂探秘!解密CS75 PLUS究竟是怎样造出来的

    长安CS75 PLUS自打上市以来,销量真的是有目共睹,仅仅一个半月就有3万多的订单,这辆车真的很火很爆款.但我不仅要提出一些疑问了,CS75 PLUS卖这么好,制造工艺怎么样呢?它又是怎么造出来的呢 ...

  3. 简单工厂抽象工厂工厂方法_让工厂美丽

    简单工厂抽象工厂工厂方法 每个名副其实的Java程序员都知道Factory Pattern . 这是一种便捷,标准化的方法,它通过教一个组件如何捕鱼而不是将它们交给它们来减少耦合. 但是,在使用大型系 ...

  4. 小工厂规章制度_小工厂的规章制度(共8篇).doc

    篇一:小工厂规章制度 工厂规章制度 一.总则 为确定生产秩序正常运作,加强公司的质量管理工作,规范全体职工的质量工作行为,使 员工尽快熟悉工作环境,能安心工作.提高工作效率,凡公司人员都应遵守本规章之 ...

  5. 【设计模式】 - 创建者模式 - 工厂方法模式、抽象工程模式

    工厂方法模式.抽象工程模式 前言 工厂方法模式. 抽象工程模式 1. 简单工厂模式(不属于GOF的23种经典设计模式) 1.1 结构 1.2 实现 缺点 2. 工厂方法模式 2.1 结构 2.2 实现 ...

  6. getresourceasstream方法_【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】...

    文章系列目录(持续更新中): [设计模式]第一篇:概述.耦合.UML.七大原则,详细分析总结(基于Java) [设计模式]第二篇:单例模式的几种实现And反射对其的破坏 一 为什么要用工厂模式 之前讲 ...

  7. 工厂方法模式、简单工厂模式、抽象工程模式

    1.概述 工厂设计模式是一种创建型模式,它提供了一种创建对象的最佳方式.在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象. 1.1. 针对的问题 在 ...

  8. JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

    各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是 设计模式的一类:对于设计模式这个概 ...

  9. Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)

    从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析. 创建型模式(5种):用于描述"怎样创建对象",它的主要特点是& ...

最新文章

  1. 深层学习:心智如何超越经验2.3 解释变化
  2. LeetCode Perfect Squares
  3. json中的值类型及输出对象的所有名称和对应的值
  4. 转载-如何做好项目的需求与业务调研
  5. php js动态显示系统时间,PHP+JS动态显示服务器时间
  6. vue 通信、传值的多种方式(超详细)
  7. SQL SERVER自定义函数
  8. mysql 吧库下的表名都加_MySQL 数据库名、表名、字段名大小写敏感记录
  9. 计算机启动单元,快速启动计算机系统的方法和计算机的启动系统与流程
  10. Ubuntu 20.04 nvtop 编译安装
  11. java围棋毕业设计,基于Java的围棋游戏的设计与实现.docx
  12. SI4463模块技术研究(结束)
  13. WDF 驱动程序echo安装
  14. 什么?学了C语言还不会表白,下面的多彩小心心快去拿给那个她吧
  15. 初探摩根大通的企业级以太坊区块链解决方案—Quorum
  16. 深入理解计算机系统 练习题3.8 理解计算机二元操作
  17. GaussDB_T 单机版轻量安装
  18. 计算机网络之在浏览器输入“www.xxx.com”后都发生了什么?
  19. C/C++宏的基本使用方法附例子讲解
  20. 同城货运烽火再燃,B端市场成货运市场新赛点

热门文章

  1. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】
  2. P3804-[模板]后缀自动机【SAM】
  3. jzoj3845-简单题【dp】
  4. 2021牛客暑期多校训练营4 E-Tree Xor(异或+思维+区间交 or Trie树)
  5. 【状压DP】十二桥问题(nowcoder 1104-B)
  6. [CSA49G][XSY3315] Bunny on Number Line (DP)
  7. Juice Extractor dp
  8. Java 父类子类的对象初始化过程
  9. Java中的注解是如何工作的
  10. Oracle入门(十四.23)之管理触发器