《HeadFirst设计模式(第二版)》第四章代码——工厂模式

news2024/11/25 23:19:17
代码文件目录结构:

Cheese:

原料ingredient类中只以Cheese为例,不重复展示:

package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public abstract class Cheese {
    String name;

    String getName(){
        return name;
    }
}
package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public class NYCheese extends Cheese{
    public NYCheese() {
        name = "NYCheese";
    }
}
package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public class ChicagoCheese extends Cheese{
    public ChicagoCheese(){
        name = "ChicagoCheese";
    }
}
PizzaIngredientFactory
package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public interface PizzaIngredientFactory {
    public Dough createDough();
    public Sauce createSauce();
    public Cheese createCheese();
    public Clams createClams();
}
NYPizzaIngredientFactory 
package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public class NYPizzaIngredientFactory implements PizzaIngredientFactory{
    @Override
    public Dough createDough() {
        return new NYDough();
    }

    public Sauce createSauce(){
        return new NYSauce();
    }

    @Override
    public Cheese createCheese() {
        return new NYCheese();
    }

    @Override
    public Clams createClams() {
        return new NYClams();
    }
}
ChicagoPizzaIngredientFactory
package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory{
    @Override
    public Dough createDough() {
        return new ChicagoDough();
    }

    public Sauce createSauce(){
        return new ChicagoSauce();
    }

    @Override
    public Cheese createCheese() {
        return new ChicagoCheese();
    }

    @Override
    public Clams createClams() {
        return new ChicagoClams();
    }
}
Pizza
package Chapter4_FactoryPattern.abstractFactoryPattern.Products;

import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.*;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public abstract class Pizza {
    String name;

    Dough dough;
    Sauce sauce;
    Cheese cheese;
    Clams clams;

    public abstract void prepare();
    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("place pizza in official PizzaStore box");
    }

    public String getName(){
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Pizza{" +
                "name='" + name + '\'' +
                ", dough=" + dough +
                ", sauce=" + sauce +
                ", cheese=" + cheese +
                ", clams=" + clams +
                '}';
    }
}
CheesePizza
package Chapter4_FactoryPattern.abstractFactoryPattern.Products;

import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.PizzaIngredientFactory;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public class CheesePizza extends Pizza{
    PizzaIngredientFactory ingredientFactory;

    public CheesePizza(PizzaIngredientFactory ingredientFactory){
        //在初始化的时候确定是哪一种品味(通过原料工厂)
        this.ingredientFactory = ingredientFactory;
    }

    @Override
    public void prepare() {
        System.out.println("preparing "+name);
        dough = ingredientFactory.createDough();
        sauce = ingredientFactory.createSauce();
        cheese = ingredientFactory.createCheese();
    }
}
ClamPizza
package Chapter4_FactoryPattern.abstractFactoryPattern.Products;

import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.PizzaIngredientFactory;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public class ClamPizza extends Pizza{
    PizzaIngredientFactory ingredientFactory;

    public ClamPizza(PizzaIngredientFactory ingredientFactory){
        this.ingredientFactory = ingredientFactory;
    }

    @Override
    public void prepare() {
        System.out.println("preparing "+name);
        dough = ingredientFactory.createDough();
        sauce = ingredientFactory.createSauce();
        cheese = ingredientFactory.createCheese();
        clams = ingredientFactory.createClams();
    }
}
PizzaStore
package Chapter4_FactoryPattern.abstractFactoryPattern;

import Chapter4_FactoryPattern.abstractFactoryPattern.Products.Pizza;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

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);

}
NYPizzaStore
package Chapter4_FactoryPattern.abstractFactoryPattern;

import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.NYPizzaIngredientFactory;
import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.PizzaIngredientFactory;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.CheesePizza;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.ClamPizza;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.Pizza;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public class NYPizzaStore extends PizzaStore {
    protected Pizza createPizza(String item){
        Pizza pizza = null;
        PizzaIngredientFactory ingredientFactory =
                new NYPizzaIngredientFactory();

        if(item == "cheese"){
            pizza = new CheesePizza(ingredientFactory);
            pizza.setName("New York Style Cheese Pizza");
        }else if(item =="clam"){
            pizza = new ClamPizza(ingredientFactory);
            pizza.setName("New York Style Clam Pizza");
        }
        return pizza;
    }
}
ChicagoPizzaStore
package Chapter4_FactoryPattern.abstractFactoryPattern;

import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.ChicagoPizzaIngredientFactory;
import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.PizzaIngredientFactory;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.CheesePizza;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.ClamPizza;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.Pizza;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public class ChicagoPizzaStore extends PizzaStore {
    @Override
    protected Pizza createPizza(String item) {
        Pizza pizza = null;
        PizzaIngredientFactory ingredientFactory =
                new ChicagoPizzaIngredientFactory();

        if(item == "cheese"){
            pizza = new CheesePizza(ingredientFactory);
            pizza.setName("Chicago Style Cheese Pizza");
        }else if(item =="clam"){
            pizza = new ClamPizza(ingredientFactory);
            pizza.setName("Chicago Style Clam Pizza");
        }
        return pizza;
    }
}
PizzaTestDrive
package Chapter4_FactoryPattern.abstractFactoryPattern;

import Chapter4_FactoryPattern.abstractFactoryPattern.Products.Pizza;

/**
 * @Author 竹心
 * @Date 2023/8/4
 **/

public class PizzaTestDrive {
    public static void main(String[] args) {
        PizzaStore nyStore = new NYPizzaStore();
        PizzaStore chicagoStore = new ChicagoPizzaStore();

        Pizza pizza = nyStore.orderPizza("cheese");
        System.out.println("Ethan ordered a "+pizza.getName()+'\n');

        pizza = chicagoStore.orderPizza("cheese");
        System.out.println("Joel ordered a "+pizza.getName()+'\n');
    }
}
notes:
简单工厂模式:
    就是将平常的new过程封装成一个类来实现

工厂方法模式:
    定义一个创建对象的接口,但是由它的子类决定要实例化哪个类。工厂方法让类把实例化推迟到子类
    这里的“决定”其实是表示用哪个接口子类来创建产品。

抽象工厂模式:
    提供一个接口,用于创建相关或者依赖对象的家族,而不必指定他们的具体类
运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国货香水,真“香”吗?

【潮汐商业评论/原创】 Judy在选择香水这块还属于入门级选手,“我只买过一次YSL的自由之水,其他都是生日时朋友送给我的。如果真让我选,说实话我还真不知道买啥。”Judy偷笑着说。 在电影《香水》中,有一句台词说到,…

走进人工智能|自主无人系统 从概念到现实的飞跃

前言: 自主无人系统是具备自主感知、决策和执行能力的智能系统,无需人类干预即可完成任务的技术体系。 文章目录 序言AUS的现有应用从概念到现实的飞跃技术发展历程 目前形式领跑人困难和挑战 总结 自主无人系统(Autonomous Unmanned Systems…

Vue2 第十九节 Vuex(二)

1.Vuex API 补充内容 2.getters 配置项 3.四个Map方法的使用 4.多组件共享数据 5.Vux模块化和命名空间 一.Vuex API补充内容 ① 在actions中,如果一个函数处理不完,可以继续调dispatch处理 ② 开发者工具是跟mutations中的数据进行交互的&#xff…

About Multiple regression

ps:this article is not very strict,just some ml and mathematic basic knowledge.My english is poor too.So If this passage make you confuse and uncomfortable.Please give me a feedback in the comment :-D Prior to this(在此之前), we learned the concept of sin…

linuxARM裸机学习笔记(2)----汇编LED灯实验

MX6ULL 的 IO IO的复用功能 这里的只使用了低五位,用来配置io口,其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的,GPIO1_IO00 一共可以复用为 9种功能 IO,分别对应 ALT0~ALT8。每种对应了不同的功能 io的属性配置 HY…

优思学院|精益生产如何真正落地?你要掌握这4个P!

怎样才能让精益生产的方法落地?这是一个经常听到的问题,但对于这个问题很多人有不同的想法和答法,因为大家对“落地”一词有着不同的看法。 “落地”是指整个管理系统的重组,是企业把所学的管理知识和方法,在经营实践…

那些不想骑车的正常理由和十三不骑。

骑友们最热门,也是常常讨论的话题大多是如何骑自行车?但有时候,我们也会思考一些另类的问题。例如,那些不想骑车的理由。 首先,我们可以从科学角度来看待这个问题。骑车虽然有益于健康,但是骑车的姿势也会对…

用msys2安装verilator并用spinal进行仿真

一 参考 SpinalHDL 开发环境搭建一步到位(图文版) - 极术社区 - 连接开发者与智能计算生态 (aijishu.com)https://aijishu.com/a/1060000000255643Setup and installation of Verilator — SpinalHDL documentation

微信认证申请流程(政府/事业单位类型)

第一步:登录微信公众平台->设置->微信认证->开通 第二步:同意协议:签署《微信公众平台认证服务协议》 第三步:验证管理员 第四步:选择认证类型及填写认证资料 选择认证类型及上传申请公函 政府/事业单位资质…

沙箱逃逸复现

当this指向window 原理 1.this直接指向window,拿到window的tostring的constructor来利用构造函数拿到process 是对象且指向沙箱外部,才可以利用 const vm require(vm); const script const process this.toString.constructor(return process)() pr…

vs code 如何配置保存cpolar所建立公共互联网网页的隧道参数?

文章目录 📋 前言1.如何配置保存cpolar所建立的隧道参数?2.本地安装 VS Code并修改隧道参数2.1 Visual studio Code 下载2.2 配置Visual studio Code 相关参数2.3 编辑 cpolar.yml 隧道参数文件2.3 修改website隧道参数 3. 检查 cpolar.yml 文件配置是否…

直播课 | 大橡科技研发总监丁端尘博士“类器官芯片技术在新药研发中的应用”

从类器官到类器官芯片,正在生物科学领域大放异彩。 药物研发需要新方法 众所周知,一款新药是一个风险大、周期长、成本高的艰难历程,国际上有一个传统的“双十”说法——10年时间,10亿美金,才可能成功研发出一款新药…

前期自学Java之Arrays篇及JDK帮助文档的下载

Assays 数组的工具类java.util.Arrays 一. 数组的简介 由于数组对象本身并没有什么方法可以提供给我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数组对象进行一些基本的操作 Arrays类中的方法都是static修饰的静态方法,在…

Spring-1-透彻理解Spring XML的Bean创建--IOC

学习目标 上一篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,实现IOC和DI,今天具体来讲解IOC 能够说出IOC的基础配置和Bean作用域 了解Bean的生命周期 能够说出Bean的实例化方式 一、Bean的基础配置 …

jenkins准备

回到目录 jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构…

项目中使用非默认字体

项目场景: 由于开发需要,默认的字体不符合开发需求,有时候我们需要引入某种字体到项目中 解决方案: 首先需要下载或引入字体包 然后创建一个 index.css 文件用于声明引入字体名称 font-face {font-family: "YouSheBiao…

用html+javascript打造公文一键排版系统13:增加半角字符和全角字符的相互转换功能

一、实践发现了bug和不足 今天用了公文一键排版系统对几个PDF文件格式的材料进行文字识别后再重新排版,处理效果还是相当不错的,节约了不少的时间。 但是也发现了三个需要改进的地方: (一)发现了两个bug&#xff1a…

一起学算法(滑动窗口篇)

前言: 对于滑动窗口,有长度固定的窗口,也有长度可变的窗口,一般是基于数组进行求解,对于一个数组中两个相邻的窗口,势必会有一大部分重叠,这部分重叠的内容是不需要重复计算的,所以我…

Nacos适配人大金仓国产数据库

nacos版本2.2.0 人大金仓版本8.6.0 一、相关文件 Nacos官方文档-数据源插件https://nacos.io/zh-cn/docs/v2/plugin/datasource-plugin.html Nacos2.2.0源码https://github.com/alibaba/nacos/archive/refs/tags/2.2.0.zip 人大金仓驱动https://download.csdn.net/download/q…

无人机航测技术有何特点?主要应用在哪些方面?

无人机航测是航空摄影测量的一种,主要面向低空遥感领域,具有成本低、快速高效、适用范围广等特点。目前,无人机航测主要应用于地形测绘、城市数字化建设、工程建设等方面。 无人机航测技术的特点 1、作业成本低 传统的人工测量技术主要利用…