[design pattern] Factory Method

Posted cafebabe-yun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[design pattern] Factory Method相关的知识,希望对你有一定的参考价值。

前言

在前面一章博主介绍了简单工厂模式(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] Factory Method的主要内容,如果未能解决你的问题,请参考以下文章

[Design Pattern] Factory Pattern 简单案例

[design pattern] Factory Method

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

Java review-design pattern

Java Design Pattern

[Design Pattern] Adapter Design Pattern