`

工厂模式:工厂方法

 
阅读更多

还是利用比萨店的例子,我们来看看一般工厂模式:

如果比萨店有许多加盟店,并且这些加盟店必须严格按照总部的要求生产比萨。

比如烘烤、切片、打包的方式。但允许加盟店根据各地的特色制作比萨。这要如何实现?

 

我们可以定义一个抽象类PizzaStore,这个类中有两个方法

orderPizza和createPizza,其中createPizza是抽象的。由子类来具体实现。

在orderPizza方法中定义比萨店的框架。

package com.headfirst.chapter4;

public abstract class PizzaStore {
	public Pizza orderPizza(String type){
		Pizza pizza;
		pizza = createPizza(type);
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
	abstract Pizza createPizza(String type);//工厂方法
}

 

纽约和芝加哥的PizzaStore继承这个抽象类

package com.headfirst.chapter4;

public class NYStylePizzaStore extends PizzaStore {

	Pizza createPizza(String type) {
		Pizza pizza = null;
		if(type.equals("cheese")){
			pizza = new NYStyleCheesePizza();
		}else if(type.equals("pepperoni")){
			pizza = new NYStylePepperoniPizza();
		}
		return pizza;
	}

}

 

package com.headfirst.chapter4;

public class ChicagoStylePizzaStore extends PizzaStore{
	
	Pizza createPizza(String type) {
		Pizza pizza = null;
		if(type.equals("cheese")){
			pizza = new ChicagoStyleCheesePizza();
		}else if(type.equals("pepperoni")){
			pizza = new ChicagoStylePepperoniPizza();
		}
		return pizza;
	}
}

 

 

在这两个子类中依据传入参数的类型来决定具体需要生产的比萨。

同样:Pizza类也定义为抽象的

package com.headfirst.chapter4;

import java.util.ArrayList;
import java.util.List;

public abstract class Pizza {
	String name;
	String dough;
	String sauce;
	List topping = new ArrayList();
	void prepare(){
		System.out.println("Preparing "+name);
		System.out.println("Tossing dough...");
		System.out.println("Adding sauce...");
		for (int i = 0; i < topping.size(); i++) {
			System.out.println(""+topping.get(i));
		}
	}
	void bake(){
		System.out.println("Bake for 25 minutes at 350 ");
	}
	void cut(){
		System.out.println("Cutting the pizza into diagonal slices ");
	}
	void box(){
		System.out.println("Place pizza in offical PizzaStore box");
		System.out.println();
	}
	public String getName(){
		return name;
	}
}

 以下为各城市加盟店具体生产的比萨

package com.headfirst.chapter4;

public class NYStyleCheesePizza extends Pizza {

	public NYStyleCheesePizza() {
		name = "NY Style Sauce and Cheese Pizza";
		dough = "Thin Crust Dough";
		sauce = "Marinara Sauce";
		topping.add("Grated Reggiano Cheese");
	}

}

 

package com.headfirst.chapter4;

public class NYStylePepperoniPizza extends Pizza {

	public NYStylePepperoniPizza() {
		name = "NY Styel Pepperon Pizza";
		dough ="NY Styel pepperon dough";
		sauce = "pepperon sauce";
		topping.add("pepperon topping");
	}

}

 

package com.headfirst.chapter4;

public class ChicagoStyleCheesePizza extends Pizza{

	public ChicagoStyleCheesePizza() {
		name = "Chicago Style Deep Dish Cheese Pizza";
		dough = "Extra Thick Crust Dough";
		sauce = "Plum Tomato Sauce";
		topping.add("Shredded Mozzarella Cheese");
	}
	void cut() {
		System.out.println("Cutting the pizza into square slice");
	}

}

 

 

package com.headfirst.chapter4;

public class ChicagoStylePepperoniPizza extends Pizza {

	public ChicagoStylePepperoniPizza() {
		name = "Chicago Style Pepperoni Pizza";
		dough = "Chicago Style Pepperoni dough";
		sauce = "Chicago Style Pepperoni sauce";
		topping.add("Chicago Style topping");
	}

}

 

最后写一个测试类:

package com.headfirst.chapter4;

public class PizzaTestDrive {
	public static void main(String[] args) {
		PizzaStore nyPizzaStore = new NYStylePizzaStore();
		PizzaStore chicagoPizzaStore = new ChicagoStylePizzaStore();
		
		nyPizzaStore.orderPizza("cheese");
		chicagoPizzaStore.orderPizza("cheese");
	}
}

 

所有的工厂模式都用来封闭对象的创建,工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封闭的目的。

 

 

定义工厂方法模式:

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的是哪一个。工厂方法让类把实例化推迟到子类。

 

上图中的Creator是一个类,它实现了所有操纵产品的方法 ,但不实现工厂方法

Creator所有的子类都必须实现这个抽象的factoryMethod()方法。

ConcreteCreator实现了factoryMethod()方法以制造实现产品。

 

简单工厂与工厂方法的差异:

简单工厂把全部的事情在一个地方都处理完了,而工厂方法却是创建一个框架,让子类决定要如何实现。

使用工厂方法有什么好处?

1,避免代码重复

2,方便后期维护

3,针对接口编程,使代码更有弹性,方便未来扩展。

分享到:
评论

相关推荐

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...

    Java工厂模式:简单工厂、工厂方法模式、抽象工厂模式代码示例

    在Java中,工厂模式分为三种:简单工厂、工厂方法模式和抽象工厂模式。 **简单工厂模式** 是最基本的工厂模式,它由一个工厂类根据传入的参数决定创建哪一种产品类的实例。简单工厂容易实现,但违反开闭原则,即...

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    java工厂方法模式和抽象工厂模式实例

    根据描述,我们将深入探讨Java中的两种工厂模式:工厂方法模式和抽象工厂模式,并通过实例来理解它们的工作原理。 首先,我们来看**工厂方法模式**。这种模式定义了一个用于创建对象的接口,但让子类决定实例化哪一...

    简单工厂模式、工厂模式、抽象工厂模式案例(C++实现)

    在这个压缩包中,包含了三种工厂模式的C++实现:简单工厂模式、工厂方法模式以及抽象工厂模式。让我们一一探讨这些模式。 1. 简单工厂模式: 简单工厂模式是一种静态工厂方法,它提供一个公共的工厂类来创建对象。...

    深入了解工厂模式&工厂方法&抽象工厂

    工厂模式分为三种主要形态:简单工厂模式、工厂方法模式和抽象工厂模式。 1. 简单工厂模式:也称为静态工厂方法模式,它通过一个静态方法来创建对象。在这个例子中,`FruitGardener` 类就是简单工厂,它根据输入的...

    工厂方法模式和抽象工厂模式的区别

    工厂方法模式和抽象工厂模式是两种常见的设计模式,它们都属于创建型模式,用于解决对象的创建问题。在软件设计中,这两种模式都是用来隔离对象的创建和使用,以提高系统的灵活性和可扩展性。 首先,工厂方法模式的...

    抽象工厂模式+工厂方法模式+策略模式+类图实现手机加工厂

    本文将探讨三个重要的设计模式:抽象工厂模式、工厂方法模式以及策略模式,并结合一个实际的场景——手机加工厂,来具体阐述它们的应用。 首先,我们来看**抽象工厂模式**。这个模式主要用于创建相关或依赖对象的...

    工厂模式(工厂方法)

    至于提供的压缩包文件"工厂方法",可能是包含了一些关于工厂模式的示例代码或者相关教程。解压后,可以通过查看这些文件来深入理解和学习如何在实际项目中应用工厂模式。 总之,工厂模式是软件设计中的一个重要概念...

    C#编程模式之工厂方法模式+抽象工厂模式

    本资源主要介绍工厂方法模式和抽象工厂模式。二者都与工厂相关,,但是其本质又大相径庭。这里先来简单介绍下二者的区别,以免混淆。 抽象工厂模式:提供一个接口,用于创建一系列相关的对象,而无需指定具体的类。...

    简单工厂-工厂方法-抽象工厂 对比总结

    本篇文章将对三种主要的工厂模式:简单工厂、工厂方法和抽象工厂进行深入的对比和总结。 **简单工厂模式** 是最基础的工厂模式形式,它提供一个静态方法或类来创建对象。在这个模式中,工厂是负责创建对象的中心...

    C++ 设计模式:简单工厂、工厂方法、抽象工厂练习代码

    本主题聚焦于C++中的三个工厂模式:简单工厂、工厂方法和抽象工厂。这些模式都围绕着对象的创建过程,旨在提高代码的灵活性、可读性和可维护性。 1. **简单工厂模式**: - 简单工厂模式是一种静态工厂方法,它提供...

    简单工厂模式,工厂方法模式,抽象工厂模式

    本文将深入探讨三种工厂模式:简单工厂模式、工厂方法模式以及抽象工厂模式,并结合源码分析其应用场景和优缺点。 1. 简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种静态工厂方法,它通过一个公共的...

    设计模式之PHP项目应用(简单工厂模式:计算器)

    1)程序功能:用简单工厂模式实现计算器功能,采用PHP编写。 2)程序详解地址:http://blog.csdn.net/clevercode/article/details/45692995。 3)原创作品,出自"CleverCode的博客",分类为《设计模式之PHP项目应用...

    工厂模式:不修改工厂,只增删类对应修改配置文件就OK啦!

    在软件设计模式中,工厂模式是一种非常常见的创建型模式,它的主要目的是为了隔离对象的创建过程,使得客户端代码不直接创建对象,而是通过一个抽象的工厂接口来获取所需的对象。这样做的好处在于提高了代码的可扩展...

    JavaScript中的工厂模式:构建灵活的对象创建机制

    通过本文的介绍,你应该能够理解工厂模式的基本概念,掌握在JavaScript中实现工厂模式的方法,并能够在实际项目中应用这一模式来构建灵活的对象创建机制。 通过本文的介绍,你应该能够理解工厂模式的重要性,掌握在...

    qt工厂模式例子qt简单工程模式源码

    参考如下博客,亲自实践了一个QT的工厂模式,亲测可用,编译运行实测。 我用qt5.6,在windows下编译并运行测试,正常。 https://blog.csdn.net/baidu_33570760/article/details/71159808 1. Qt工厂模式源码 2. C++...

    工厂模式(简单工厂,普通工厂,抽象工厂)代码java

    工厂模式分为三种主要类型:简单工厂模式、普通工厂模式(也称为工厂方法模式)和抽象工厂模式。 1. **简单工厂模式**: - 简单工厂模式中,有一个中心工厂类,它负责根据输入条件(通常是一个参数)来创建具体的...

    工厂方法模式uml类图

    java设计模式 工厂方法模式uml类图,一张图就让你秒懂工厂方法模式

    工厂方法模式和抽象工厂模式

    在软件设计模式中,工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)是两种常用的创建型设计模式,它们都属于“工厂”家族,但有着不同的应用场景和目标。 工厂方法模式的核心...

Global site tag (gtag.js) - Google Analytics