你的比萨店经营有成,击败了竞争者,现在大家都希望比萨店能在自家附近有加盟店。身为加盟公司经营者,你希望确保加盟店营运的质量,因为砸牌子砸的是你的牌子,所以你希望这些店都使用你那些经过时间考验的代码,好让比萨的流程一成不变。但是区域的差异呢?每家加盟店都可能想要提供不同风味的比萨,这受到了开店地点及该地区比萨美食家口味的影响。
我们利用SimplePizzaFactory,写出三种不同的工厂,分别是NYPizzaFactory、ChicagoPizzaFactory、CaliforniaPizzaFactory,那么各地的加盟店都有合适的工厂可以用,这是一种办法,让我们看看会变成什么样子:
在推广SimpleFactory时,你发现加盟店的确是采用你的工厂创建比萨,但是其他部分呢,却开始采用他们自创的流程:烘烤的做法有些差异、不要切片、使用其他厂商的盒子。我们只需要管加盟店是卖比萨的,我们不需要了解他卖的是什么样比萨,是怎么样做的这种比萨。在我们稍早的SimplePizzaFactory代码之前,制作比萨的代码绑在PizzaStore里,但这么做却没有弹性。有个做法可以让比萨制作活动局限于PizzaStore类,而同时又能让这些加盟店依然可以自由地制作该区域的风味。所要做的事就是把createPizza()方法放回到PizzaStore中,不过要把它设置成抽象方法,然后为每个区域风味创建一个PizzaStore的子类,让子类做决定
首先看看PizzaStore所做的改变:
现在已经有一个PizzaStore作为超类;让每个域类型(NYPizzaFactory、ChicagoPizzaFactory、CaliforniaPizzaFactory)都继承这个PizzaStore,每个子类各自决定如何制作比萨。别忘了,PizzaStore已经有一个不错的订单系统,由OrderPizza()方法负责处理订单,而你希望所有加盟店对于订单的处理都能一致。各个区域比萨店之间的差异在于他们制作比萨的风味,做法如下:
让我们来开加盟店吧,这是纽约风味的:
上面的代码是对工厂方法的实现,工厂方法即抽象的PizzaStore类,让我们靠近一点观察工厂方法,
根据上面可以看出,工厂方法是抽象的,所以依赖子类来处理对象的创建。工厂方法必须返回一个产品。超类中定义的方法,通常使用到工厂方法的返回值。工厂方法将客户(也就是超类中的代码,例如orderPizza())和实际创建具体产品的代码分隔开来。刚刚忽略了一件事:比萨本身!如果没有比萨可出售,我们的比萨店开得再多也不行,现在让我们来实现比萨:
现在我们需要一些具体子类.......来定义纽约和芝加哥风味的芝士比萨,怎么样?
你已经等的够久了,来吃些比萨吧!
或许你如果想吃上比萨,需要补充部分代码,或者注释掉部分代码才能使比萨顺利的生产出来,但这对你一定不困难。辛苦了那么久,认识工厂方法模式的时刻终于到了。所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定该创建的对象是什么,来达到将对对象创建的过程封装的目的。工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类中。需要注意的是所谓的“决定”,并不是指模式允许子类本身在运行时决定,而是指在编写创建者类时,不需要知道实际创建的产品是哪一个。选择了使用哪个子类,自然就决定了实际创建的产品是什么。类图如下:
工厂方法的子类看起来很像简单工厂,但他们却不一样。简单工厂把全部的事情,在一个地方都处理完了,然而工厂方法却是创建一个框架,让子类决定要如何实现。比方说,在工厂方法中,orderPizza()方法提供了一半的框架,以便创建比萨,orderPizza()方法依赖工厂方法创建具体类,并制造出实际的比萨。课通过继承PizzaStore类,决定实际制造出的比萨是什么。简单工厂的做法,可以将对象的创建封装起来,但是简单工厂不具备工厂方法的弹性,因为简单工厂不能变更正在创建的产品。
分享到:
相关推荐
设计模式C++学习之工厂方法模式(Factory Method)
C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)
工厂方法模式是面向对象设计模式中的行为型模式之一,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个工厂类负责创建对象,而具体的创建过程被延迟到了子类中,使得子类可以在不修改原有代码的基础上决定...
今天我们要探讨的是设计模式中的一个经典成员——工厂方法模式(Factory Method Pattern)。工厂方法模式是创建型设计模式的一种,它提供了一种创建对象的最佳方式。 ### 一、什么是工厂方法模式? 工厂方法模式...
《设计模式之——工厂方法(Factory Method)》 在软件工程中,设计模式是一种解决常见问题的可重用解决方案,它被广泛应用于构建高质量、可维护的代码。工厂方法是面向对象设计模式的一种,属于创建型模式。这个...
工厂方法模式是面向对象设计模式中的一个核心模式,属于创建型模式。它的主要目的是通过引入一个工厂接口,将具体的对象创建过程封装起来,使得客户端在使用时无须关心产品类的确切实现,只需要通过工厂来获取所需的...
Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。
工厂方法(Factory Method)是面向对象设计模式中的一个基础且广泛应用的模式,它属于创建型模式,主要目的是为了解耦对象的创建过程。本文将深入探讨工厂方法的设计理念、实现方式及其在实际开发中的应用。 ### ...
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪一个具体类。这样,客户端代码就不需要知道具体的类是什么,只需通过工厂接口获取对象。 工厂...
### Factory Method 工厂方法模式(创建型模式) #### 概述 在软件工程领域,设计模式是一种在特定上下文中解决常见问题的通用方案。Factory Method(工厂方法)模式是GoF(Gang of Four)设计模式之一,属于创建型...
2. **工厂方法**:工厂方法模式将具体产品的创建延迟到子类中,定义一个创建对象的接口,但由子类决定要实例化的类。这样,工厂方法让类的实例化推迟到子类,增加了系统的灵活性,同时也符合"开闭原则"。 3. **抽象...
张建中的"C#面向对象设计模式之abstract method视频教程"可能涵盖了如何在C#中实现工厂方法模式的具体步骤,包括如何定义抽象产品类、具体产品类、抽象工厂类和具体工厂类,以及如何在客户端代码中使用这些类。...
C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式) (Level 300)
工厂方法模式是设计模式中的创建型模式之一,它在软件工程中扮演着非常重要的角色,尤其是在C#这样的面向对象编程语言中。工厂方法模式提供了一种封装对象创建过程的方法,使得具体的创建过程延迟到子类中进行,从而...
工厂方法(Factory Method)是工厂模式的一种具体实现,它是《Head First 设计模式》这本书中讲解的重点之一。在这个模式中,一个工厂类声明了一个创建对象的抽象方法,但并不实现这个方法。而是由子类决定要实例化...
本学习教案旨在讲解设计模式中的工厂方法模式(Factory Method),通过学习本教案,学生将掌握工厂方法模式的定义、结构、实例、分析和应用。 模式动机与定义 在软件设计中,我们经常需要创建对象,但是在什么时候...
在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...