文章目录

  • 1. 定义
  • 2. 类图
  • 3. Java实现案例
    • 3.1 抽象类:Pizza和PizzaStore
    • 3.2 具体披萨:北京两种上海两种共四种
    • 3.3 具体披萨店:北京店和上海店
    • 3.4 测试主方法

1. 定义

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

2. 类图

  • 所以具体产品必须实现一个共同的Product接口(抽象类)
  • Creator是一个抽象类,它实现了所有到操作产品的方法,但不实现工厂方法factoryMethod
  • ConcreteCreator负责创建一个或多个具体Product
  • 工厂方法主要用来处理对象的创建,并将创建对象的行为封装在子类中

这里遵循依赖倒置的原则:要依赖抽象,不要依赖具体类

注意⚠️:在设计模式中,“实现一个接口”不一定就是指“写一个类,并利用implement关键词来实现某个java接口”,“实现一个接口”泛指实现某个超类型(类或者接口)的某个方法

3. Java实现案例

场景:

  • 披萨店生产披萨
  • 披萨有相同的处理流程,但有不同的处理方法,比如披萨都需要烘烤,但不同的披萨也许有不同的烘烤温度要求
  • 不同的披萨店能制作的披萨类型也不同
  • 易于扩展,增加新类型的披萨或新的披萨店

思考准备:

  • 根据工厂方法的类图,Product即为披萨、Creator即为披萨店,因此设计抽象Class:披萨、披萨店
  • 根据“工厂方法主要用来处理对象的创建,并将创建对象的行为封装在子类中”,我们需要在抽象Creator中设计抽象创建披萨店方法,并由继承它的子类进行具体实现
  • 易于扩展,具体披萨类继承抽象披萨类、具体披萨店类继承抽象披萨店类。

3.1 抽象类:Pizza和PizzaStore

Pizza:

package Factory;import java.util.ArrayList;/*** 抽象披萨*/
public abstract class Pizza {String name; // 名称String dough; // 面团类型String sauce; // 酱料类型ArrayList toppings = new ArrayList(); // 一套装饰品佐料// 准备void prepare(){System.out.println("Preparing " + name);System.out.println("Tossing dough..");System.out.println("Adding sauce..");System.out.println("Adding toppings:");for(int i = 0; i < toppings.size(); i++){System.out.println("  " + toppings.get(i));}}// 烘焙void bake(){System.out.println("Bake for 30 min at 360");}// 分切void cut(){System.out.println("Cutting the pizza into diagonal slices");}// 打包void box(){System.out.println("Place pizza in official PizzaStore box");}public String getName(){return name;}}

PizzaStore:

package Factory;/*** 抽象披萨商店*/
public abstract class PizzaStore {public Pizza orderPizza(String type){Pizza pizza;// 创建披萨pizza = createPizza(type);// 制作披萨并打包pizza.prepare();pizza.bake();pizza.cut();pizza.box();// 返回披萨return pizza;}protected abstract Pizza createPizza(String type);
}

3.2 具体披萨:北京两种上海两种共四种

北京披萨1

package Factory;/*** 具体披萨*/
public class BjStyleCheesePizza extends Pizza {public BjStyleCheesePizza(){name = "BeiJing Cheese Pizza";dough = "Thin Curst Dough";sauce = "LaoGanMa Sauce";toppings.add("Grated Reggiano Cheese");}
}

北京披萨2

package Factory;/*** 具体披萨*/
public class BjStyleVeggiePizza extends Pizza {public BjStyleVeggiePizza(){name = "BeiJing Veggie Pizza";dough = "Bj2 Dough";sauce = "Bj2 Sauce";toppings.add("Bj2 Cheese");}// 这个北京披萨覆盖了cut方法,将披萨切成正方形@Overridevoid cut() {System.out.println("Cutting the pizza into square slices");}
}

上海披萨1

package Factory;/*** 具体披萨*/
public class ShStyleCheesePizza extends Pizza {public ShStyleCheesePizza(){name = "Shanghai Veggie Pizza";dough = "Sh2 Dough";sauce = "Sh2 Sauce";toppings.add("Sh2 Cheese");}
}

上海披萨2

package Factory;/*** 具体披萨*/
public class ShStyleVeggiePizza extends Pizza {public ShStyleVeggiePizza(){name = "Shanghai Veggie Pizza";dough = "Sh2 Dough";sauce = "Sh2 Sauce";toppings.add("Sh2 Cheese");}
}

3.3 具体披萨店:北京店和上海店

工厂方法主要用来处理对象的创建,并将创建对象的行为封装在子类中。在本Demo中“创建对象的行为”即具体类中的createPizza方法。

北京店能生产北京的两种披萨

package Factory;/*** 具体披萨商店*/
public class BeiJingPizzaStore extends PizzaStore{@Overrideprotected Pizza createPizza(String type) {if (type.equals("cheese")){return new BjStyleCheesePizza();} else if (type.equals("veggie")) {return new BjStyleVeggiePizza();}// 等等其他类型的上海披萨return null;}
}

同理,上海店能生产上海店两种披萨

package Factory;/*** 具体披萨商店*/
public class ShangHaiPizzaStore extends PizzaStore{@Overrideprotected Pizza createPizza(String type) {if (type.equals("cheese")){return new ShStyleCheesePizza();} else if (type.equals("veggie")) {return new ShStyleVeggiePizza();}// 等等其他类型的上海披萨return null;}
}

3.4 测试主方法

package Factory;/*** 测试主方法*/
public class MainPizzaTest {public static void main(String[] args) {PizzaStore pizzaStore1 = new BeiJingPizzaStore(); // 北京披萨店Pizza cheeseFormBj = pizzaStore1.orderPizza("cheese"); // 点一份cheeseSystem.out.println(cheeseFormBj.getName());// 其他同上,如预定上海披萨店的Veggie披萨}
}

输出:

代码结构:

参考文献:《Head First设计模式(中文版)》弗里曼

【设计模式】工厂方法模式Factory(Java)相关推荐

  1. 设计模式 - 工厂方法模式 - 基于 Java 实现

    常见和工厂有关的设计模式 和工厂相关的设计模式主要有三种,工厂方法模式,抽象工厂模式: 在前面的博客中介绍了简单工厂模式,本篇博客主要介绍的是工厂方法模式 什么是工厂方法模式 工厂方法模式是简单工厂的 ...

  2. JAVA设计模式 - 工厂方法模式

    工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...

  3. Java设计模式-工厂方法模式的使用和介绍

    一.工厂方法模式简介 1.定义 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorph ...

  4. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  5. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  6. 设计模式 | 工厂方法模式及典型应用

    工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...

  7. 工厂方法模式(Java)

    工厂方法模式(Java) 下面是关于我所写的所有设计模式代码(还是建议自己手打或者想一个别的例子练习一次) (https://github.com/lihang212010/DesignPattern ...

  8. 工厂方法模式(Factory Method)简介

    工厂方法模式 名字 跟已经介绍的 简单工厂模式很类似. 实际上它们的模型也是十分相似的. 我们先看看工厂模式的定义. 一. 工厂方法(Factory Method)模式定义 教材上是这样写的: 工厂方 ...

  9. 4. 星际争霸之php设计模式--工厂方法模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  10. 《转》java设计模式--工厂方法模式(Factory Method)

    本文转自:http://www.cnblogs.com/archimedes/p/java-factory-method-pattern.html 工厂方法模式(别名:虚拟构造) 定义一个用于创建对象 ...

最新文章

  1. Platform Builder 5下WinCE 5.0目录结构
  2. Kotlin基本语法和使用
  3. Windows 10版星巴克应用现身官网
  4. Curl 采集乱码 gzip 原因及解决方案 utf-8
  5. Ecshop显示商品销售数量
  6. 使用python+ffmpeg批量转换格式
  7. java 验证服务器宕机_java服务宕机原因查询
  8. ubuntu16.04 kinect2 驱动和ROS驱动
  9. 腾讯云服务器Ubuntu20.04初始化配置
  10. eclipse折叠if语句块_第五章 if语句
  11. Java基础 - 易错知识点整理(待更新)
  12. python取出字典重复值_从字典中提取重复值
  13. 时域分析——有量纲特征值含义一网打尽
  14. SEO人员必备技术有哪些
  15. 最新百度地图—POI搜索功能讲解
  16. 让游戏在英国取得成功的 5 个技巧
  17. Windows:nginx: [error] CreateFile() “/logs/nginx.pid“ failed (2: The system)
  18. 关于微信分享 签名不一致的问题解决
  19. 苹果邮箱 android设置字体,如何更改Mac OS X中的邮件字体大小?
  20. 与国同庆--单片机小白自制蓝牙避障小车

热门文章

  1. 网络安全--安全认证、IPSEC技术
  2. 正确评估貌似可行的策略及其陷阱
  3. IT,挨踢?走在十字路口的大学IT民工党
  4. pdfboss转换器免费pdf转word
  5. 比起妹子,程序员更喜欢这种类型的键盘!最后一个大家都用过!
  6. PTA练习 05集合框架
  7. Facebook 把大数据做成了扑克牌,被广告人捧成了《广告圣经》
  8. python3维图形_matplotlib 填充3维闭合图像
  9. WPF Win7和Win10 TextBox 使能false时,背景色属性触发不生效问题
  10. 阿卡西斯 USB4 雷电4 移动硬盘盒做Mac系统盘 体验