工厂方法模式

一、什么是工厂方法模式?

引入案例:话说前一阵疫情期间,居家的时间有点长,于是我也跟广大 友一样,开始好好修炼自己的厨艺,有人 做凉皮,有人做锅巴。我也加入了霍霍面粉的大军–做面包。

于是和面、发面、捏成我想要的布朗熊的样子,开心放入烤箱 ,等待我的布朗熊面包出炉。然而,步骤没错,烤箱 没错,可能是大厨不对:

第一次:时间稍短了点,没太烤熟,于是布朗熊面包变成了北极熊面包;

再来一次:时间长点肯定能熟了,烤箱中多靠一会,出炉发现烤焦啦,与布朗熊面包变成了黑熊面包;

第三次:吸取教训,别跟时间死磕了,一直盯着烤箱中的面包好了,等到面包微微发焦,终于成功的做出了我想要 的布朗熊面包。

好在家人给面子,每一种面包都有人吃掉哈。

在这个过程中,我的职业病就犯了,是不是可以通过软件开发来实现这个过程呢?

在面向对象的思想中,万物皆对象。是对象我们就可以通过软件设计来实现。来分析一下烤面包的过程,该过程涉 及三个对象:大厨(也就是我哈)、烤箱、三种不同成果的面包(我称他们为北极熊、黑熊、布朗熊)。

大厨可以使用场景类Client来表示,烤箱类似一个工厂,负责生产产品(即面包),三种不同成果的面包都是一个 接口下不同实现类,因为好不好吃好不好看也都是面包啊。

面包接口:

public interface Bread {    //每个面包都有自己的颜色    public void getColor();}

北极熊面包:

public class PolarBearBread implements Bread{    public void getColor() {        System.out.println("烤的时间有点短的-----北极熊面包!!!");    }}

黑熊面包:

public class BlackBearBread implements Bread{    public void getColor() {        System.out.println("烤的时间有点长的-----黑熊面包!!!");    }}

布朗熊面包:

public class BrownBearBread implements Bread{    public void getColor() {        System.out.println("烤的时间刚刚好的-----布朗熊面包!!!");    }}

抽象面包创建工厂:

public abstract class AbstractBreadFactory {    public abstract Bread createBread(Class cls);}

具体面包创建工厂:

public class BreadFactory extends AbstractBreadFactory {    public Bread createBread(Class cls){        //定义一个生产的面包        Bread bread=null;        try {            //产生一个面包            bread= (Bread) Class.forName(cls.getName()).newInstance();        } catch (Exception e) {            e.printStackTrace();            System.out.println("烤面包出错了?!");        }        return bread;    }}

大厨:

public class Chef {    public static void main(String[] args) {        //来一个helloKitty烤箱        AbstractBreadFactory kitty=new BreadFactory();        //大厨第1次烤面包稍显急躁,时间不足,于是产生了北极熊面包        System.out.println("----大厨第1次烤面包");        Bread polorBearBread=kitty.createBread(PolarBearBread.class);        polorBearBread.getColor();        //大厨第2次烤面包耐心十足,时间过长,于是产生了黑熊面包        System.out.println("----大厨第2次烤面包");        Bread blackBearBread=kitty.createBread(BlackBearBread.class);        blackBearBread.getColor();        //大厨第3次烤面包机智无比,时间刚刚好,于是产生了布朗熊面包        System.out.println("----大厨第3次烤面包");        Bread brownBearBread=kitty.createBread(BrownBearBread.class);        brownBearBread.getColor();    }}

万事俱备,见证奇迹的时刻:

二、工厂方法模式的定义

定义:

定义一个用户创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

工厂方法模式的主要角色如下:

1. 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct()来创建产品。2. 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

我们可以将工厂方法模式抽取出一个实用的通用代码:

//抽象产品:提供了产品的接口public interface Product{    public void method();}//具体的产品可以有多个,都实现抽象产品接口public class ConcreteProduct1 implements Product{    public void method(){        //具体业务逻辑处理,例如        System.out.println("具体产品1显示...");    }}public class ConcreteProduct2 implements Product{    public void method(){        //具体业务逻辑处理,例如        System.out.println("具体产品2显示...");    }}//抽象工厂:负责定义产品对象的产生public abstract class AbstractFactory{    //创建一个产品对象,输入的参数类型可以自行设置    public abstract <T extends Product>T createProduct(Class<T> tClass);}//具体工厂:具体如何生产一个产品的对象,是由具体的工厂类实现的public class ConcreteFactory implements AbstractFactory{    public <T extends Product> T createProduct(Class<T> tClass) {        Product product=null;        try {            product=(T)Class.forName(tClass.getName()).newInstance();        } catch (Exception e) {            //异常处理        }        return (T)product;    }}//场景类:public class Client {    public static void main(String[] args) {        AbstractFactory factory=new ConcreteFactory();        Product product=factory.createProduct(ConcreteProduct1.class);        //继续其他业务处理    }}

三、工厂方法模式的应用场景

工厂方法模式通常适用于以下场景。

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
  • 客户不关心创建产品的细节,只关心产品的品牌。
  • 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年10月2日
    下一篇 2022年10月2日

    相关推荐