前言

在前面一章博主介绍了简单工厂模式(Simple Factory),接着上面的章节,今天博主就来介绍下工厂方法模式(Factory Method)。

思考题

首先,让我们来思考下面的问题:

在上一章的内容中我们提到了,博主开了一家饭店,那么,因为经营有方,博主准备在四川和上海开饭店了,也还是那两个菜,大家都知道上海和四川的口味差距非常的大,上海口味偏甜,那么四川口味偏辣。所以为了迎合当地人的口味,我们需要做不同口味的菜。那么你们会怎么做呢?

这时我们如果在原有的简单工厂上添加不同口味的菜,就会违背‘开放-关闭’原则,那么接下来就让我来隆重介绍工厂方法模式。

工厂方法模式

定义:定义一个创建产品的工厂的接口,将具体的产品的创建推迟到工厂子类中,符合‘开发-关闭’原则。

类图:

上面的类图,设计以下的几个角色:

  • 抽象产品:为一类产品定义了统一接口。将具体实现与用户解耦。
  • 具体产品:实现了抽象产品定义的接口,不同的产品有不同的实现。
  • 抽象工厂:为一类工厂定义了统一接口。
  • 具体工厂:实现了抽象工厂定义的方法,用来创建具体的产品。

思考题实现

首先,定义一个抽象产品类:

Food.java:

public interface Food {
void fry();
void putSeasoning();
void eat();
}

然后,实现具体的产品:

ShangHaiKungPaoChicken.java:

public class ShangHaiKungPaoChicken implements Food {
@Override
public void fry() {
System.out.println("上海,炒宫保鸡丁!!!");
} @Override
public void putSeasoning() {
System.out.println("上海,加入宫保鸡丁作料!!!");
} @Override
public void eat() {
System.out.println("上海,吃宫保鸡丁!!!");
}
}

ShanghaiTomatoEgg.java:

public class ShangHaiTomatoEgg implements Food {
@Override
public void fry() {
System.out.println("上海,炒西红柿炒蛋!!!");
} @Override
public void putSeasoning() {
System.out.println("上海,放入西红柿炒蛋作料!!!");
} @Override
public void eat() {
System.out.println("上海,吃西红柿炒蛋!!!");
}
}

SiCHuanKungPaoChicken.java:

public class SiChuanKungPaoChicken implements Food {
@Override
public void fry() {
System.out.println("四川,炒宫保鸡丁!!!");
} @Override
public void putSeasoning() {
System.out.println("四川,加入宫保鸡丁作料!!!");
} @Override
public void eat() {
System.out.println("四川,吃宫保鸡丁!!!");
}
}

SiChuanTomatoEgg.java:

public class SiChuanTomatoEgg implements Food {
@Override
public void fry() {
System.out.println("四川,炒西红柿炒蛋!!!");
} @Override
public void putSeasoning() {
System.out.println("四川,放入西红柿炒蛋作料!!!");
} @Override
public void eat() {
System.out.println("四川,吃西红柿炒蛋!!!");
}
}

再然后,定义一个抽象工厂接口:

AbstractHotal.java:

public abstract class AbstractHotal {
public Food saleFood(String foodName) {
Food food = createFood(foodName); food.putSeasoning();
food.fry();
return food;
} public abstract Food createFood(String foodName);
}

再然后,实现抽象工厂:

ShangHaiHotal.java:

public class ShangHaiHotal extends AbstractHotal {
@Override
public Food createFood(String foodName) {
switch(foodName) {
case "KungPaoChicken":
return new ShangHaiKungPaoChicken();
case "TomatoEgg":
return new ShangHaiTomatoEgg();
default:
return null;
}
}
}

SiChuanHotal.java:

public class SiChuanHotal extends AbstractHotal {
@Override
public Food createFood(String foodName) {
switch(foodName) {
case "KungPaoChicken":
return new SiChuanKungPaoChicken();
case "TomatoEgg":
return new SiChuanTomatoEgg();
default:
return null;
}
}
}

下面是我的测试类:

Custom.java:

public class Custom {
public static void main(String ...args) {
ShangHaiHotal shangHaiHotal = new ShangHaiHotal();
SiChuanHotal siChuanHotal = new SiChuanHotal(); Food shangHaiKungPaoChicken = shangHaiHotal.saleFood("KungPaoChicken");
Food shangHaiTomatoEgg = shangHaiHotal.saleFood("TomatoEgg");
shangHaiKungPaoChicken.eat();
shangHaiTomatoEgg.eat(); Food siChuanKungPaoChicken = siChuanHotal.saleFood("KungPaoChicken");
Food siChuanTomatoEgg = siChuanHotal.saleFood("TomatoEgg");
siChuanKungPaoChicken.eat();
siChuanTomatoEgg.eat();
}
}

[design pattern](5) Factory Method的更多相关文章

  1. Design Pattern ->Abstract Factory

    Layering & Contract Philosophy With additional indirection Abstract Factory //The example code i ...

  2. Design Pattern —— Prototype /Template Method/Iterator/Composite/Bridge

    Prototype /Template Method/Iterator/Composite/Bridge 为什么把这五种设计模式放一起呢,没什么太高大上的原因,就是因为这五种模式JAVA开发最基本的特 ...

  3. LN : Eden Polymorphic And OOP Design Pattern Abstract Factory

    Appreciation to our TA, +7, who designed this task. Client.cpp #include <iostream> #include &l ...

  4. 简单工厂设计模式(Simple Factory Design Pattern)

    [引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ...

  5. Factory Method

    Question:Based on the previous article,what could you do if we must add an extra  function? For exam ...

  6. Design Pattern ->Factory Method

    Layering & Contract Philosophy With additional indirection Factory Method The example code is as ...

  7. Design Pattern ——Factory Method&Abstract Factory

    今天开始复习设计模式.设计模式相关的资料有很多,概念性的东西就画个图就可以了.把关注点放在例子上,设计模式还是要使用中才有感受. 从Factory Method&Abstract Factor ...

  8. Java Design Pattern(Factory,Singleton,Prototype,Proxy)

    一.Factory 设计模式: the most common pattern,create a new object ,eg. A a=new A();工厂模式的好处:工厂模式可以做到把创建对象单独 ...

  9. 打造属于你的提供者(Provider = Strategy + Factory Method) 设计模式 - Provider Pattern(提供者模式)

    打造属于你的提供者(Provider = Strategy + Factory Method)   1.1.1 摘要 在日常系统设计中,我们也许听说过提供者模式,甚至几乎每天都在使用它,在.NET F ...

随机推荐

  1. 小记---------FLUM的三种配置方式:spooldir、exec、hadoop sink

    FLUM概述     是一个分布式的数据收集系统,具有高可靠.高可用.事务管理.失败重启等功能,数据处理速度快,完全可以用于生产环境   核心:agent(是FLUM的一个代号,名字    ).age ...

  2. 【一个蒟蒻的挣扎】LCA (倍增)

    #include<cstdio> #include<iostream> #include<cstring> using namespace std; struct ...

  3. JavaSE--基础知识

    Java基础知识 一.基础知识 1.java命名规则 由26个英文字母大小写,0-9 ,_或 $ 组成 数字不可以开头. 不可以使用关键字和保留字,但能包含关键字和保留字. Java中严格区分大小写, ...

  4. Jpa/Hibernate 字节码增强:字段延迟加载

    JPA提供了@Basic注解,实现延迟加载字段的功能,如下: @Basic(fetch = FetchType.LAZY) @Column(name = "REMARK_CONTENT&qu ...

  5. Swoole开启守护进程后如何关闭

    查找相应端口号对应的PID(以我的为例,我的是9501端口) netstat -apn | 清除这个进程 启动客户端这时就会报错连不上了,证明服务已关

  6. luogu P3210 [HNOI2010]取石头游戏

    传送门 不会结论做个鬼系列 题意其实是在头尾(最多)两个栈以及中间一些双端队列依次取数,然后每个人都要最大化自己的价值 有一个结论,如果一段序列中,出现了三个相邻位置\(A,B,C\),满足\(A\l ...

  7. CF Gym102028G Shortest Paths on Random Forests

    传送门 这题要求的期望,就是总权值(所有不在同一个连通块点对的贡献+同一连通块点对的贡献)/总方案(森林个数) 先求森林个数,森林是由一堆树组成的,而根据purfer序列,一棵\(n\)个点的有标号的 ...

  8. vue引入jquery插件

    在vue中使用jquery插件 1.引入jquery 第一种方法:全局引入jquery 在webpack.base.conf.js,新增以下代码 plugins: [ new webpack.opti ...

  9. k8s+docker+proget 镜像制作

    安装proget 1 首先在k8s上运行proget的数据库配置有个注意点:要根据proget官网要求的sql server排序方式建数据库,不然数据保存的时候会报错 2 proget运行起来后,默认 ...

  10. 2019-11-29-win10-uwp-如何开始写-uwp-程序

    title author date CreateTime categories win10 uwp 如何开始写 uwp 程序 lindexi 2019-11-29 10:12:42 +0800 201 ...