[design pattern](5) 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();
    }
}

原文地址:https://www.cnblogs.com/cafebabe-yun/p/11396377.html

时间: 2024-10-09 08:10:45

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

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

[引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见解的是,区分了设计模式(Design Pattern),结构模式(Architecture Pattern),架构类型(Architecture Style). 如下图所示 Design Pattern:是基于代码层面的,就是针对解决功能模块之间的问题而采用恰当的设计模式,比如依赖注入,简单工厂,适

Design Pattern ——Factory Method&Abstract Factory

今天开始复习设计模式.设计模式相关的资料有很多,概念性的东西就画个图就可以了.把关注点放在例子上,设计模式还是要使用中才有感受. 从Factory Method&Abstract Factory开始. 一.Factory Method 工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 我们的例子如下: 我们项目中有一个代码提交记录releasenote,我们需要将这个releasenote分成csv/xls/xml格式分别导出 1 public interface

工厂方法模式(Factory Method Pattern)

2. 工厂方法模式(Factory Method Pattern) 2.1. 模式动机 现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮.矩形按钮.菱形按钮等,它们实现在抽象按钮工厂类中定义的方法.这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一

Abstract Factory Design Pattern 抽象工厂设计模式 - 总结

Abstract Factory Design Pattern 就是一般的Factory Design Pattern的进一步设计,增加一个抽象工厂,然后利用这个工厂可以创建不同基类的类. 当我们需要创建更多不同类的时候就可以使用这个设计模式了. 这个设计模式的代码相对会多点,但是其中的思想就是一般Factory Design Pattern,然后集合更多的基类,看起来挺大的一个设计模式,其思想是挺简单的. 其中具体的实现细节当然是可以有多种实现方法的: 1 利用Factory的基类衍生出不同的

Software Engineering | Factory method pattern

工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象.这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象. 有时,特定类型对象的控制过程比简单地创建一个对象更复杂.在这种情况下,工厂对象就派上用场了.工厂对象可能会动态地创建产品对象的类,或者从对象池中返回一个对象,或者对所创建的对象进行复杂的配置,或者应用其他的操作. 这些类型的对象很有用.几个不同的设计模式都应用了工厂的概念,并可以使用在很多语言中.例如,在<设计模式>一书中,像工厂方法模式.抽象工厂模式.

[Design Pattern] Factory Pattern 简单案例

Factory Pattern , 即工厂模式,用于创建对象的场景,属于创建类的设计模式 . 下面是一个工厂模式案例. Shape 作为接口, Circle, Square, Rectangle 作为具体类实现了 Shape 接口. ShapeFactory 封装了创建各个 Shape 的方式,隐藏了 new 命令.FactoryPatternDemo 用于演示工厂模式. 具体代码: Shape 接口定义 public interface Shape { public void draw();

工厂模式(Factory Method Pattern)

模式定义 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式.在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类. UML类图 Product 抽象产品 ConcreteProduct

工厂模式--工厂方法模式(Factory Method Pattern)

2.1. 模式动机 现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮.矩形按钮.菱形按钮等,它们实现在抽象按钮工厂类中定义的方法.这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一特点无疑使得工厂方法模式具有超越简单工厂模式的优越性,更加符合"开闭

Design Pattern - Template Method(C )

Definition Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure. Participants The classes and/or obj