【设计模式】工厂方法模式Factory(Java)
文章目录
- 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)相关推荐
- 设计模式 - 工厂方法模式 - 基于 Java 实现
常见和工厂有关的设计模式 和工厂相关的设计模式主要有三种,工厂方法模式,抽象工厂模式: 在前面的博客中介绍了简单工厂模式,本篇博客主要介绍的是工厂方法模式 什么是工厂方法模式 工厂方法模式是简单工厂的 ...
- JAVA设计模式 - 工厂方法模式
工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...
- Java设计模式-工厂方法模式的使用和介绍
一.工厂方法模式简介 1.定义 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorph ...
- java 工厂方法_java设计模式-工厂方法模式
1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- 设计模式 | 工厂方法模式及典型应用
工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...
- 工厂方法模式(Java)
工厂方法模式(Java) 下面是关于我所写的所有设计模式代码(还是建议自己手打或者想一个别的例子练习一次) (https://github.com/lihang212010/DesignPattern ...
- 工厂方法模式(Factory Method)简介
工厂方法模式 名字 跟已经介绍的 简单工厂模式很类似. 实际上它们的模型也是十分相似的. 我们先看看工厂模式的定义. 一. 工厂方法(Factory Method)模式定义 教材上是这样写的: 工厂方 ...
- 4. 星际争霸之php设计模式--工厂方法模式
题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...
- 《转》java设计模式--工厂方法模式(Factory Method)
本文转自:http://www.cnblogs.com/archimedes/p/java-factory-method-pattern.html 工厂方法模式(别名:虚拟构造) 定义一个用于创建对象 ...
最新文章
- Platform Builder 5下WinCE 5.0目录结构
- Kotlin基本语法和使用
- Windows 10版星巴克应用现身官网
- Curl 采集乱码 gzip 原因及解决方案 utf-8
- Ecshop显示商品销售数量
- 使用python+ffmpeg批量转换格式
- java 验证服务器宕机_java服务宕机原因查询
- ubuntu16.04 kinect2 驱动和ROS驱动
- 腾讯云服务器Ubuntu20.04初始化配置
- eclipse折叠if语句块_第五章 if语句
- Java基础 - 易错知识点整理(待更新)
- python取出字典重复值_从字典中提取重复值
- 时域分析——有量纲特征值含义一网打尽
- SEO人员必备技术有哪些
- 最新百度地图—POI搜索功能讲解
- 让游戏在英国取得成功的 5 个技巧
- Windows:nginx: [error] CreateFile() “/logs/nginx.pid“ failed (2: The system)
- 关于微信分享 签名不一致的问题解决
- 苹果邮箱 android设置字体,如何更改Mac OS X中的邮件字体大小?
- 与国同庆--单片机小白自制蓝牙避障小车