`

深入浅出设计模式四——比萨店生产比萨实现(工厂方法模式)

阅读更多

http://quicker.iteye.com/blog/571714一文中已经讲了简单工厂和工厂方法并且有UML图和实现的代码。

这里只结合实例分析一下工厂方法在实际生活中的应用。

我们看看比萨店及比萨的图。

 

 

产品图。

结合http://quicker.iteye.com/blog/571714中关于工厂方法模式的实现,不难得出实现代码:

package com.lwf.disign.learn.factorymethod;

public abstract class PizzaStore {

	public final Pizza orderPizza(String type){
		Pizza pizza;
		pizza = createPizza(type);
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
		
	}
	abstract Pizza createPizza(String type);
}

 

package com.lwf.disign.learn.factorymethod;

public class NYPizzaStore extends PizzaStore {

	Pizza createPizza(String type) {
		Pizza pizza = null;
		if(type.equals("cheese")){
			pizza = new NYCheesePizza();
		}else if(type.equals("veggle")){
			pizza = new NYVegglePizza();
		}
		return pizza;
	}

}

 

package com.lwf.disign.learn.factorymethod;

public class ChicagoPizzaStore extends PizzaStore {

	Pizza createPizza(String type) {
		Pizza pizza = null;
		if(type.equals("cheese")){
			pizza = new ChicagoCheesePizza();
		}else if(type.equals("veggle")){
			pizza = new ChicagoVegglePizza();
		}
		return pizza;
	}

}

 

package com.lwf.disign.learn.factorymethod;

import java.util.ArrayList;

public abstract class Pizza {

	String name;	//名称
	String dough;	//面团类型
	String sauce;	//酱料类型
	ArrayList toppings = new ArrayList(); //一套佐料
	
	public void prepare() {
		
		System.out.println("Preparing " + name);
		System.out.println("Tossign dough..." + dough);
		System.out.println("Adding sauce..." + sauce);
		System.out.println("Adding toppings: ");
		for (int i = 0; i < toppings.size(); i++) {
			System.out.println(" " + toppings.get(i));
			
		}
		
	}

	public void bake() {
		System.out.println("Bake for 25 minutes at 350");
	}

	public void cut() {
		System.out.println("Cutting the pizza into diagonal slices");
	}

	public void box() {
		System.out.println("Pizza in offical PizzaStrore box");
	}
	
	public String getName(){
		return name;
	}
}

 

package com.lwf.disign.learn.factorymethod;

public class NYCheesePizza extends Pizza {

	public NYCheesePizza(){
		name = "NYCheesePizza";
		dough = "Thin crust dough NYCheesePizza";
		sauce = "Marina sauce NYCheesePizza";
		toppings.add("Grated NYCheesePizza cheese");
	}
	
	public void cut(){
		System.out.println("cut it into NYCheesePizza slices");
	}
}

 

package com.lwf.disign.learn.factorymethod;

public class NYVegglePizza extends Pizza {

	public NYVegglePizza(){
		name = "NYVegglePizza";
		dough = "Thin crust dough NYVegglePizza";
		sauce = "Marina sauce NYVegglePizza";
		toppings.add("Grated NYVegglePizza cheese");
	}
	
	public void cut(){
		System.out.println("cut it into NYVegglePizza slices");
	}
}

 

package com.lwf.disign.learn.factorymethod;

public class ChicagoCheesePizza extends Pizza {

	public ChicagoCheesePizza(){
		name = "ChicagoCheesePizza";
		dough = "Thin crust dough ChicagoCheesePizza";
		sauce = "Marina sauce ChicagoCheesePizza";
		toppings.add("Grated ChicagoCheesePizza cheese");
	}
	
	public void cut(){
		System.out.println("cut it into ChicagoCheesePizza slices");
	}
}

 

package com.lwf.disign.learn.factorymethod;

public class ChicagoVegglePizza extends Pizza {
	public ChicagoVegglePizza(){
		name = "ChicagoVegglePizza";
		dough = "Thin crust dough ChicagoVegglePizza";
		sauce = "Marina sauce ChicagoVegglePizza";
		toppings.add("Grated ChicagoVegglePizza cheese");
	}
	
	public void cut(){
		System.out.println("cut it into ChicagoVegglePizza slices");
	}
}

 

上面共定义了四种比萨,客户向系统订购这四种比萨。。

package com.lwf.disign.learn.factorymethod;

public class PizzaStoreTest {

	public static void main(String[] args) {

		PizzaStore pizzaStore = new NYPizzaStore();
		Pizza pizza = pizzaStore.orderPizza("cheese");
		print(pizza.getName());
		
		pizza = pizzaStore.orderPizza("veggle");
		print(pizza.getName());
		
		pizzaStore = new ChicagoPizzaStore();
		pizza = pizzaStore.orderPizza("cheese");
		print(pizza.getName());
		
		pizza = pizzaStore.orderPizza("veggle");
		print(pizza.getName());
		
	}

	public static void print(String name){
		System.out.println(name);
		System.out.println("-------------------------------------------------------------");
	}
}

 输出结果为:

Preparing NYCheesePizza
Tossign dough...Thin crust dough NYCheesePizza
Adding sauce...Marina sauce NYCheesePizza
Adding toppings: 
 Grated NYCheesePizza cheese
Bake for 25 minutes at 350
cut it into NYCheesePizza slices
Pizza in offical PizzaStrore box
NYCheesePizza
-------------------------------------------------------------
Preparing NYVegglePizza
Tossign dough...Thin crust dough NYVegglePizza
Adding sauce...Marina sauce NYVegglePizza
Adding toppings: 
 Grated NYVegglePizza cheese
Bake for 25 minutes at 350
cut it into NYVegglePizza slices
Pizza in offical PizzaStrore box
NYVegglePizza
-------------------------------------------------------------
Preparing ChicagoCheesePizza
Tossign dough...Thin crust dough ChicagoCheesePizza
Adding sauce...Marina sauce ChicagoCheesePizza
Adding toppings: 
 Grated ChicagoCheesePizza cheese
Bake for 25 minutes at 350
cut it into ChicagoCheesePizza slices
Pizza in offical PizzaStrore box
ChicagoCheesePizza
-------------------------------------------------------------
Preparing ChicagoVegglePizza
Tossign dough...Thin crust dough ChicagoVegglePizza
Adding sauce...Marina sauce ChicagoVegglePizza
Adding toppings: 
 Grated ChicagoVegglePizza cheese
Bake for 25 minutes at 350
cut it into ChicagoVegglePizza slices
Pizza in offical PizzaStrore box
ChicagoVegglePizza
-------------------------------------------------------------

  

 

设计原则:要依赖抽象,不要依赖具体类,也叫依赖倒置原则

如下图:

 可以看到上下都依赖于pizza这个抽象类..

 这启发我们思考方式的变化,我们也可以倒置思考方式:如一般你想开个比萨店先会想到要用什么做比萨,考虑一大堆原料等。。。最后才是比萨店。那么我们可以改变思考的方式,我们只需要把比萨先做一个抽象。那们上我们可以开比萨店,下我们可以制作多种类型的比萨。

下面有几种方式可以让我们尽可能的遵守倒置原则

然而上面的三点要求对待程序可谓是严格的。。当然如果一个类以后变化的机会很少,那么为什么不直接new出来呢。如String类。。所以这些都只是让我们的设计变得更好的方针,不能死套在程序上。

分享到:
评论

相关推荐

    深入浅出设计模式四——多区域比萨加盟店生产比萨实现(抽象工厂模式)

    今天我们将深入探讨“抽象工厂模式”(Abstract Factory Pattern),它在“深入浅出设计模式四——多区域比萨加盟店生产比萨实现”中得到了应用。这个模式主要用于创建一系列相关的对象,而无需指定其具体的类。 ...

    设计模式-简单工厂模式-披萨店C#语言版

    压缩包中的`setup.exe`和`Pizza.msi`可能是安装程序,用于部署这个披萨店的简单工厂模式实现。`setup.exe`通常是Windows应用程序的自解压安装包,而`.msi`文件是Microsoft Installer格式,用于在Windows上进行软件...

    简单工厂实现多态比萨店

    在这个"简单工厂实现多态比萨店"的例子中,我们将探讨如何利用C#语言和简单工厂模式来构建一个多态的比萨售卖系统。 简单工厂模式的主要思想是定义一个工厂类,它负责创建某一类对象,而具体的对象类型由工厂来决定...

    设计模式培训资料之工厂方法模式

    ### 设计模式培训资料之工厂方法模式 #### 工厂方法模式详解 工厂方法模式是一种常用的软件设计模式,属于创建型模式的一种。它的主要目的是封装对象的创建过程,通过引入工厂角色来创建对象,从而避免在客户端...

    Head First 设计模式(中文完整版+附书源码)

    这本书深入浅出地介绍了23种经典设计模式,帮助读者提升软件设计能力,实现可维护、可扩展和可复用的代码。 设计模式可以分为三类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建过程,如单例模式...

    设计模式-C # 经典设计模式

    在C#中,设计模式的应用涵盖了策略模式、观察者模式、装饰者模式、工厂模式、单件模式、命令模式、适配器模式、门面模式、模板方法模式、迭代器模式、合成模式、状态模式、代理模式和复合使用模式等多个方面。...

    The Factory Pattern(工厂模式)ppt

    工厂模式有三种主要形式:简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式中,工厂类静态方法创建对象;工厂方法模式将对象的创建委托给子类;抽象工厂模式则关注创建相关或依赖对象的家族,而不必指定它们...

    大数据案例——买披萨的故事学习教案.pptx

    这篇“大数据案例——买披萨的故事”是一个虚构的场景,但它揭示了大数据在现代商业中的应用和潜在影响。故事中,比萨店通过CRM(客户关系管理)系统,结合各种数据源,如会员卡信息、医疗记录、图书馆借阅记录、...

    面向对象10个设计模式类图和总结

    五、工厂方法模式 定义:提供一个接口来创建对象,但让子类决定实例化哪个类。 应用条件:需要在运行时动态地选择创建哪个对象 案例:比萨饼工厂、简单工厂 类图: * Factory(工厂) + createProduct(创建...

    大数据案例——买披萨的故事PPT教案.pptx

    大数据案例——买披萨的故事PPT教案.pptx 本资源是一个关于大数据案例的PPT教案,旨在通过一个买披萨的故事来讲解大数据的应用场景和技术。下面是从该资源中总结出的知识点: 1. 客户关系管理(CRM)系统:该系统...

    披蕯连锁店行销策略之探讨——以必胜客为例.ppt

    《披萨连锁店营销策略探讨——以必胜客为例》 必胜客,自1986年进入台湾市场以来,作为一家国际化的披萨连锁店,已经深入当地消费者心中。面对竞争激烈的西式餐饮市场,如何巩固并提升顾客满意度,以实现顾客忠诚度...

    比萨店:订购比萨饼的Web应用程序

    比萨店() 披萨订购Web应用程序。 该应用程序具有比萨饼构建器,该比萨饼构建器使用户可以从多种配料中构建自定义比萨饼,选择地壳,大小,烘烤和切割样式以及所需的数量。 用户还可以选择其中一种特色披萨,并...

    比萨店存储库

    总的来说,"比萨店存储库"项目是一个典型的Java后端应用程序,通过Repository模式和相关框架实现了对比萨店业务的管理和控制。开发者可以通过这个项目学习到Java编程、数据库设计、ORM框架的使用以及如何构建一个...

    披萨餐厅和他们出售的比萨-数据集

    3,500个比萨及其菜单价格,您可以使用此数据来探索您披萨最合理的价格。 数据集介绍 简述 披萨店,3,500个比萨及其菜单价格的列表。 数据描述 这是由Datafiniti的业务数据库提供的来自多家餐厅的3500多个比萨饼的...

    java子类继承父类实例-披萨的选择实现代码

    本篇文章主要介绍了Java子类继承父类实例-披萨的选择实现代码,通过编写程序实现比萨制作,选择需要制作的比萨。可供选择的比萨有:培根比萨和海鲜比萨。下面是相关知识点的总结: 一、Java继承的概念 继承是面向...

    The-Moon-Pizza:比萨店的Creada para The Moon披萨

    【标题】"The-Moon-Pizza:比萨店的Creada para The Moon披萨" 暗示了这是一个为名为"The Moon Pizza"的比萨店定制的项目。这个项目可能涉及网站设计、在线订餐系统或者是一个互动的菜单平台,以提升顾客的用餐体验。...

    pizza:这是一个欢迎您访问YSL比萨店的网站,您可以在此下订单订购披萨

    为了创建一个欢迎页面,开发者可能会使用`&lt;h1&gt;`标签来创建一个大号的标题,比如"欢迎来到YSL比萨店"。接着,他们会使用`&lt;p&gt;`标签来添加描述性文本,如"在这里,您可以轻松地下单订购您喜爱的比萨"。为了使页面更具...

    披萨的幼儿教案.doc

    同时,列举出制作披萨所需的材料,如比萨酱、洋葱、黄油、粘奶酪、水果、自发粉、鸡蛋、牛奶、青椒、培根、豌豆、玉米和香菇等,让孩子们了解披萨丰富的配料和制作过程。 二、教学内容与步骤 1. 起稿:鼓励孩子们...

    比萨店

    【比萨店】项目是一个基于Java技术开发的模拟餐厅管理系统的应用。这个系统的主要目标是为比萨店的日常运营提供便利,包括菜单管理、订单处理、库存控制、客户关系管理等多个方面。在这个项目中,Java语言的强大特性...

Global site tag (gtag.js) - Google Analytics