介绍工厂模式和建造者模式都是创造模式。在工厂模式下,客户端在不知道对象来源的情况下请求创建对象(即不知道对象是从哪个类生成的)。工厂模式背后的思想是简化对象创建的过程。工厂模式通常有两种形式:工厂方法,这是一种为不同的输入参数返回不同对象的方法(或者用Python惯用术语来说,是函数)。抽象工厂,是一组用于创建一系列相关对象的工厂方法。当需要构建更复杂的对象时,可以使用构建器模式。Builder模式和工程模式之间的区别:Factory模式在单个步骤中创建对象,而Builder模式在多个步骤中创建对象并且几乎总是使用director。建造者模式通常由两部分组成:建造者:负责创建一个复杂对象的各个部分的组件导向器:使用建造者实例来控制建造过程的组件工厂方法工厂方法基于单个函数创建对象任务。执行工厂方法,传入一个参数,提供反映意图的信息,就可以创建想要的对象了。例如:createProduct,只需要提供产品名称即可返回对应的ProductcreateProduct("Product1")createProduct("shirt")例如:Django框架使用工厂方法创建表单字段forms.CharField(max_length=100)forms.DateField(required=False)1.什么时候使用工厂方法模式如果你发现创建对象的代码分布在很多不同的地方,而不是在一个单一的函数/方法中,导致很难跟踪创建的对象应用程序,那么你应该考虑使用工厂方法模式。工厂方法集中了对象创建并使跟踪对象变得更容易。创建多个工厂方法完全没问题,而且通常在实践中这样做。2、工厂方法模式的优点是将对象的创建和使用解耦,修改工程方法非常容易,不需要同时修改使用这个工程方法的代码。工厂方法仅在绝对必要时才创建新对象,从而提高性能和内存使用率。3.工厂方法案例一:HTML按钮工厂HTML按钮有几种类型:Button,Input,Image开发一个工厂方法通过传入参数返回不同按钮的html代码#工厂方法案例一:HTML按钮工厂类按钮(对象):html=""defget_html(self):returnself.htmlclassImage(Button):html=""classInput(Button):html=""defcreate_button(name):c_name=name.capitalize()ifc_namein['Button','Image','Input']:返回globals()[c_name]()print(create_button('image').get_html())
4.工厂方法案例二:将create_button封装到一个类中多个工厂方法可以封装到另一个类中#factory方法案例二:将create_button封装到一个类中#可以把其他的create方法放在HTMLFactoryclassHTMLFactory:button_types=['Button','Image','Input']defcreate_button(self,name):c_name=name.capitalize()ifc_nameinself.button_types:returnglobals()[c_name]()print(HTMLFactory().create_button('button').get_html())抽象工厂抽象工厂设计模式是一个通用工厂方法抽象工厂是工厂方法的集合,每个工厂方法负责生成不同种类的对象。1.何时使用工厂方法,抽象工厂通常从简单的工厂方法开始。如果您发现您的应用程序需要许多工厂方法并且组合这些方法来创建一系列对象是有意义的,请使用抽象工厂。2、抽象工厂案例一:玩具厂定义了一个抽象工厂,有多个工厂方法。定义两个玩具工厂,分别生产汽车玩具和毛绒玩具。#抽象工厂案例1:玩具工厂fromabcimportABC,abstractmethodclassAbstractToy(ABC):@abstractmethoddefname(self)->str:pass@abstractmethoddefprice(self)->int:passclassAbstractFactory(ABC):@abstractmethoddefcreate_toy(self,name)->AbstractToy:passclassCarToyFactory(AbstractFactory):types=['BMW','Porsche','Buick']defcreate_toy(self,name):#这里部分代码省略,具体实现参考工厂方法return"CarToy:"+nameclassStuffedToyFactory(AbstractFactory):types=['Bear','Cat','Dog']defcreate_toy(self,name):return"StuffedToy:"+namefactory=CarToyFactory()print(factory.create_toy('BMW'))CarToy:BMWbuilderpattern在工厂模式(工厂方法或抽象工厂)为不适合,我们使用建造者模式创建对象。想要创建一个复杂的对象(一个由许多部分组成的对象,可能需要按照特定的顺序在不同的步骤中创建)。需要不同的对象表示,并希望将对象的构造与表示分离。在某个时间点创建一个对象,但在稍后的时间点访问它是可取的。###fluentbuilder示例classPizza:def__init__(self,builder):self.garlic=builder.garlicself.extra_cheese=builder.extra_cheesedef__str__(self):garlic='yes'ifself.garlicelse'no'cheese='yes'ifself.extra_cheeseelse'no'info=(f'Garlic:{garlic}',f'Extracheese:{cheese}')return'\n'.join(info)#builder模式类PizzaBuilder:def__init__(self):自我。extra_cheese=虚假的自我。garlic=Falsedefadd_garlic(self):自我。garlic=True返回selfdefadd_extra_cheese(self):self.extra_cheese=Truereturnselfdefbuild(self):returnPizza(self)if__name__=='__main__':pizza=Pizza.PizzaBuilder().add_garlic().add_extra_cheese().build()print(pizza)大蒜:yesExtracheese:yes总结工厂模式有两种形式:工厂方法和抽象工厂,首选工厂方法实现工厂模式的优点:解耦对象的创建和使用,修改工程非常方便方法,同时使用该工程方法不需要修改代码;工厂方法仅在必要时绝对使用只有创建新的对象才能提高性能和内存占用文渊网,仅供学习,如有侵权请联系删除。我的公众号【Python圈】里收集了优质的技术文章和经验总结。为了方便大家,我也整理了一套学习资料,免费提供给热爱Python的同学们!还有学习交流群,多交流问题才能进步更快~
