扫码关注微信公众号

回复“面试手册”,获取本站PDF版

回复“简历”,获取高质量简历模板

回复“加群”,加入程序员交流群

回复“电子书”,获取程序员类电子书

当前位置: 计算机基础 > 设计模式 > 工厂模式

工厂模式相比于上次介绍的代理模式,实现起来会简单一些。

工厂模式是使用频率比较高的设计模式,例如在Spring框架就应用了工厂模式,可以看到不少Factory

工厂模式可以分为简单工厂模式工厂模式抽象工厂模式三种,实现的复杂程度是递增的,但不是越复杂就越好,应该在不同的场景使用适合该场景的工厂模式

简单工厂模式

简单工厂模式不属于23种设计模式,其实现起来也是非常简单,简单来说就是定义一个工厂类,根据传入的不同参数返回不同的实例。说起来比较抽象,看下代码就理解了,先看UML类图,主要可以分为三部分,工厂类、抽象接口、具体产品,以生产手机为例,可以生产华为和小米两种手机

简单工厂模式

代码如下

抽象接口(AbstractProduct),抽象接口的作用是定义一些产品公用的方法,比如拍照等,会在具体产品中有不同的实现

public interface Phone {
    void myPhone(); //随便定义一个方法
}

具体产品(XiaoMi)

public class XiaoMI implements Phone {
    public XiaoMI() {
        this.myPhone();
    }
    @Override
    public void myPhone() {
        System.out.println(" XiaoMi Phone");
    }
}

具体产品(HUAWEI)

public class HUAWEI implements Phone {
    public HUAWEI() {
        this.myPhone();
    }
    @Override
    public void myPhone() {
        System.out.println(" HUAWEI Phone");
    }
}

工厂类(PhoneFactory)

public class PhoneFactory {
    public Phone productPhone(String phoneType) {
        if(phoneType.equalsIgnoreCase("XiaoMi")){
            return new XiaoMi();
        }
        else if(phoneType.equalsIgnoreCase("HUAWEI")) {
            return new HUAWEI();
        }
        return null;
    }
}

测试一下(client)

public class client {
    public static void main(String[] arg) {
        PhoneFactory factory = new PhoneFactory();
        Phone XiaoMi = factory.productPhone("XiaoMI");
        Phone HUAWEI = factory.productPhone("HUAWEI");
    }
}

这就是简单工厂模式,很简单,就是通过传入不同的参数创建不同的实例

工厂模式

工厂模式相比简单工厂模式复杂了一点,将工厂类进行了细分,并且定义了一个抽象工厂类,还是用上面的例子就是,工厂类变成了抽象工厂类,并且多了生产华为手机的工厂类和生产小米手机的工厂类,如下图

工厂模式

和简单工厂相比就是将工厂类进行了拆分,并且抽象出一个抽象工厂,代码如下

具体产品类和抽象接口类没有变化,和简单工厂中的一样,

抽象工厂类(AbstractFactory)

public interface AbstractFactory {
    Phone productPhone();
}

XiaoMiFactory

public class XiaoMiFactory implements AbstractFactory{
    @Override
    public Phone productPhone() {
        return new XiaoMi();
    }
}

HUAWEIFactory

public class HUAWEIFactory implements AbstractFactory{
    @Override
    public Phone productPhone() {
        return new HUAWEI();
    }
}public class HUAWEIFactory implements AbstractFactory{
    @Override
    public Phone productPhone() {
        return new HUAWEI();
    }
}

测试一下,

class client {
    public static void main(String[] arg) {
        AbstractFactory XiaoMiFactory = new XiaoMiFactory();
        AbstractFactory HUAWEIFactory = new HUAWEIFactory();
        XiaoMiFactory.productPhone();
        HUAWEIFactory.productPhone();
    }
}

看到这里,可能很多人没有看到工厂模式的优势在哪,反倒是一眼就看到了劣势,明显代码更加复杂了,要是再有其他手机那不是还得再加不少工厂类。

其实工厂模式这种做法是对代码的一种解耦,会使得代码更加方便扩展,用设计模式的话说就是遵循了开放封闭原则(设计模式六大原则之一),开闭原则是指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。用人话讲就是,代码尽可能通过扩展来实现新的需求或变化,而不是通过修改已有的代码。

比如再加一个OPPO手机,只需要增加OPPOFactory和OPPO具体的实现类,不需要改动原有代码

这就是工厂模式相比于简单工厂模式的优势和劣势,下面在看更加复杂的抽象工厂模式

抽象工厂模式

抽象工厂在思想上和工厂模式非常相似,只是对工厂模式进行了扩展,简单工厂模式和工厂模式都是只针对手机这种单一商品,现在华为和小米的工厂也要开始生产电脑了,只需要在工厂模式中扩展一下就可以了,增加一个PC接口,及具体实现类即可,这就是抽象工厂模式,如下图

抽象工厂模式

为了加以区分,将之前的手机相关的名称后加了Phone,并且抽象工厂接口及工厂方法接口增加生产电脑的相应方法,代码如下

AbstractProductPC

public interface PC {
    void myPC();
}

XiaoMiPC

public class XiaoMiPC implements PC {
    public XiaoMiPC() {
        this.myPC();
    }
    @Override
    public void myPC() {
        System.out.println("XiaoMi PC");
    }
}

HUAWEIPC

public class HUAWEIPC implements PC {
    public HUAWEIPC() {
        this.myPC();
    }
    @Override
    public void myPC() {
        System.out.println("HUAWEI PC");
    }
}public class HUAWEIPC implements PC {
    public HUAWEIPC() {
        this.myPC();
    }
    @Override
    public void myPC() {
        System.out.println("HUAWEI PC");
    }
}

AbstrctFactory

public interface AbstractFactory {
    Phone productPhone();
    PC productPC();
}

XiaoMiFactory

public class XiaoMiFactory implements AbstractFactory{
    @Override
    public Phone productPhone() {
        return new XiaoMi();
    }

    @Override
    public PC productPC() {
        return new XiaoMiPC();
    }
}

HUAWEIFactory

public class HUAWEIFactory implements AbstractFactory{
    @Override
    public Phone productPhone() {
        return new HUAWEI();
    }

    @Override
    public PC productPC() {
        return new HUAWEIPC();
    }
}

测试一下(client)

class client {
    public static void main(String[] arg) {
        AbstractFactory XiaoMiFactory = new XiaoMiFactory();
        AbstractFactory HUAWEIFactory = new HUAWEIFactory();
        XiaoMiFactory.productPhone();
        XiaoMiFactory.productPC();
        HUAWEIFactory.productPhone();
        HUAWEIFactory.productPC();
    }
}

输出输出

 XiaoMi Phone
XiaoMi PC
 HUAWEI Phone
HUAWEI PC

这就是抽象工厂模式,三种工厂模式没有好坏之分,只有适合与不适合,应针对不同的场景,选择合适的工厂模式


点击面试手册,获取本站面试手册PDF完整版