工厂方法模式--GOF的23个之一
前言:来自《Head First 设计模式》,不涉及任何商务往来,仅为学习使用,作为参照笔记。定义了一个创建对象的接口,但由子类决定要实例化类是哪一个。工厂方法类把实例化推迟到子类。
工厂方法模式类图
原本是由一个对象负责所有具体类的实例化,改为一群子类来负责实例化。
优点:工厂方法模式帮助我们将产品的“实现”从“使用”中解耦。
缺点:利用字符串传入参数化的类型,很危险。
下面给出一张实例类图,来做一些分析:
一、 有个做法可以让客户产品(比萨)制作活动局限于工厂客户类(PizzaStore),而同时又能让这些加盟工厂客户类(加盟店)依然可以*地制作该区域的风味。
二、 工厂客户类方法(orderPizza())对客户产品(Pizza对象)做了许多事情(加工、修改),但由于客户产品(Pizza对象)是抽象的,工厂客户类(orderPizza())并不知道哪些实际的具体类参与进来了。换句话说,这就是解耦(decouple)。
三、 当工厂客户类方法(orderPizza())调用工厂客户类方法(creatPizza())时,某个比萨店子类将负责创建比萨。
做哪一种产品(比萨)呢?当然是由具体的客户类(比萨店)来决定。
四、 工厂经常只产生一种对象,不需要参数化。学习中采用的方式称为“参数化工厂方法”。它可以根据传入的参数创建不同的对象。模式的这两种形式都是有效的。
五、 简单工厂模式与工厂方法模式的区别。
简单工厂把全部的事情,在一个地方都处理完了,然而工厂方法却是创建一个框架,让子类决定要如何实现。比方说,在工厂方法中,orderPizza()方法提供了一般的框架,以便创建比萨,orderPizza()方法依赖工厂方法创建的具体类,并制造出实际的比萨。可通过继承PizzaStore类,可以将对象的创建封装起来,但是简单工厂不具备工厂方法的弹性,因为简单工厂不能变更正在创建的产品。
让子类做决定。
理解:普通人申请成为客户(继承PizzaStore),需要产品时,客户自己向工厂要。
继承PizzaStore,实现creatPizza()。--工厂-方法。
如有好的建议,可留言或发至笔者邮箱:fzb_xxzy@163.com