Java 设计模式之工厂模式

87 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

一、工厂模式

工厂模式不是一种单独的设计模式,而是3种功能相近的设计模式的总称,如下:

为了方便理解,我们以创建口罩为例子来说明:

1.1、简单工厂模式

定义:简单工厂模式拥有唯一的工厂类,工厂类根据传入的参数经过 if-else 条件判断决定去创建哪个产品

举例说明:

我们定义一个口罩的接口,它下面有高端口罩和低端口罩两种产品子类,现在我们使用简单工厂模式去创建他们:

//定义一个口罩的接口
interface IMask{
    void show();
}

//口罩的具体实现,高端口罩
class HighMask implements IMask{

    @Override
    public void show() {
        System.out.println("我是高端口罩");
    }
}

//口罩的具体实现,低端口罩
class LowMask implements IMask{

    @Override
    public void show() {
        System.out.println("我是低端口罩");
    }
}

//简单工厂拥有唯一的工厂类
class MaskFactory{
    public IMask createMask(String type){
        IMask mask = null;
        if("高端口罩".equals(type)){
            mask = new HighMask();
        }else if("低端口罩".equals(type)){
            mask = new LowMask();
        }
        return mask;
    }
}

//测试类
public class FactoryClient {

    public static void main(String[] args) {
        MaskFactory maskFactory = new MaskFactory();
        IMask mHighMask = maskFactory.createMask("高端口罩");
        IMask mLowMask = maskFactory.createMask("低端口罩");
        mHighMask.show();
        mLowMask.show();
    }
}

//打印结果
我是高端口罩
我是低端口罩

缺点: 当我新增产品子类又要去新增if-else条件判断,不符合开闭原则,针对这种情况我们可以使用工厂方法模式

1.2、工厂方法模式

定义:工厂方法模式拥有多个工厂,利用多态去创建不同的产品对象,避免了简单工厂模式冗余的 if-else 条件判断

我们给不同的产品子类创建一个对应的工厂:

//定义一个口罩的接口
interface IMask{
    void show();
}

//口罩的具体实现,高端口罩
class HighMask implements IMask{

    @Override
    public void show() {
        System.out.println("我是高端口罩");
    }
}

//口罩的具体实现,低端口罩
class LowMask implements IMask{

    @Override
    public void show() {
        System.out.println("我是低端口罩");
    }
}

//定义生产口罩的工厂接口
interface IMaskFactory{
    IMask createMask();
}

//高端口罩工厂类
class HighMaskFactory implements IMaskFactory{

    @Override
    public IMask createMask() {
        return new HighMask();
    }
}

//低端口罩工厂类
class LowMaskFactory implements IMaskFactory{

    @Override
    public IMask createMask() {
        return new LowMask();
    }
}

//测试类
public class FactoryClient {

    public static void main(String[] args) {
        IMaskFactory mHighMaskFactory = new HighMaskFactory();
        IMaskFactory mLowMaskFactory = new LowMaskFactory();
        IMask mHighMask = mHighMaskFactory.createMask();
        IMask mLowMask = mLowMaskFactory.createMask();
        mHighMask.show();
        mLowMask.show();
    }
}

//打印结果
我是高端口罩
我是低端口罩

缺点: 当我新增的不同类型的产品,例如防护服,而且也分为高端防护服和低端防护服,依次类推,那么我们针对这些产品子类都需要去创建一个工厂子类,工厂子类将会变的非常多,针对这种情况我们可以使用抽象工厂模式

1.3、抽象工厂模式

定义:抽象工厂模式会把不同产品子类进行分组,组内不同的产品子类对应同一个工厂子类的不同创建方法,这样就减少了工厂子类的创建

例如我们刚才说的,这个时候我们又新增了高端防护服和低端防护服,那么这个时候我们就可以划分高端产品和低端产品两个分组,高端产品包括高端口罩和高端防护服,低端产品包括低端口罩和低端防护服,针对这个产品分组,我们就只需要创建高端工厂和低端工厂就ok了,这样就减少了工厂子类的创建:

//定义一个口罩的接口
interface IMask{
    void show();
}

//口罩的具体实现,高端口罩
class HighMask implements IMask{

    @Override
    public void show() {
        System.out.println("我是高端口罩");
    }
}

//口罩的具体实现,低端口罩
class LowMask implements IMask{

    @Override
    public void show() {
        System.out.println("我是低端口罩");
    }
}

//定义防护服的接口
interface IProtectiveSuit{
    void show();
}

//防护服的具体实现,高端防护服
class HighProtectiveSuit implements IProtectiveSuit{

    @Override
    public void show() {
        System.out.println("我是高端防护服");
    }
}

//防护服的具体实现,低端防护服
class LowProtectiveSuit implements IProtectiveSuit{

    @Override
    public void show() {
        System.out.println("我是低端防护服");
    }
}

//定义工厂接口
interface IFactory{
    IMask createMask();
    IProtectiveSuit createSuit();
}

//高端工厂
class HighFactory implements IFactory{

    @Override
    public IMask createMask() {
        return new HighMask();
    }

    @Override
    public IProtectiveSuit createSuit() {
        return new HighProtectiveSuit();
    }
}

//低端工厂
class LowFactory implements IFactory{

    @Override
    public IMask createMask() {
        return new LowMask();
    }

    @Override
    public IProtectiveSuit createSuit() {
        return new LowProtectiveSuit();
    }
}

//测试类
public class FactoryClient {

    public static void main(String[] args) {
        IFactory mHighFactory = new HighFactory();
        IFactory mLowFactory = new LowFactory();

        IMask mHighMask = mHighFactory.createMask();
        IProtectiveSuit mHighProtectiveSuit = mHighFactory.createSuit();

        IMask mLowMask = mLowFactory.createMask();
        IProtectiveSuit mLowProtectiveSuit = mLowFactory.createSuit();

        mHighMask.show();
        mHighProtectiveSuit.show();
        mLowMask.show();
        mLowProtectiveSuit.show();
    }
}

//打印结果
我是高端口罩
我是高端防护服
我是低端口罩
我是低端防护服

1.4、工厂方法模式和抽象工厂模式的异同

异:

1、工厂方法模式针对的是单个产品等级结构,而抽象工厂模式针对的是多个产品的等级结构

2、工厂方法模式每个具体的工厂只能创建一种产品对象,而抽象工厂模式的具体工厂能创建多个产品对象

同:

1、工厂方法模式和抽象工厂模式的抽象产品都拥有多个具体的实现产品

2、工厂方法模式和抽象工厂模式的抽象工厂类都有多个具体的实现工厂类

二、总结

本篇文章我们介绍了 Java 设计模式中的工厂模式,大家可以根据自己的需求选择一种合适的工厂模式

好了,本篇文章到这里就结束了,希望能给你带来帮助 🤝