一、什么是工厂方法模式?
引入案例:话说前一阵疫情期间,居家的时间有点长,于是我也跟广大 友一样,开始好好修炼自己的厨艺,有人 做凉皮,有人做锅巴。我也加入了霍霍面粉的大军–做面包。
于是和面、发面、捏成我想要的布朗熊的样子,开心放入烤箱 ,等待我的布朗熊面包出炉。然而,步骤没错,烤箱 没错,可能是大厨不对:
第一次:时间稍短了点,没太烤熟,于是布朗熊面包变成了北极熊面包;
再来一次:时间长点肯定能熟了,烤箱中多靠一会,出炉发现烤焦啦,与布朗熊面包变成了黑熊面包;
第三次:吸取教训,别跟时间死磕了,一直盯着烤箱中的面包好了,等到面包微微发焦,终于成功的做出了我想要 的布朗熊面包。
好在家人给面子,每一种面包都有人吃掉哈。
在这个过程中,我的职业病就犯了,是不是可以通过软件开发来实现这个过程呢?
在面向对象的思想中,万物皆对象。是对象我们就可以通过软件设计来实现。来分析一下烤面包的过程,该过程涉 及三个对象:大厨(也就是我哈)、烤箱、三种不同成果的面包(我称他们为北极熊、黑熊、布朗熊)。
大厨可以使用场景类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); //继续其他业务处理 }}
三、工厂方法模式的应用场景
工厂方法模式通常适用于以下场景。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!