超级好懂的设计模式——工厂模式

本文详细介绍了设计模式中的工厂模式,包括简单工厂模式、工厂方法模式和抽象工厂模式。通过实例展示了如何创建和使用不同类型的门和窗户,强调了开闭原则和单一职责原则在设计模式中的应用。对于扩展产品种类,工厂方法模式和抽象工厂模式更加灵活,符合面向对象设计的原则。
摘要由CSDN通过智能技术生成

精心整理了设计模式——工厂模式,并配图加代码,方便理解,实属不易,但是难免不了存在纰漏,感谢大家的指正与理解!觉的写的不错的小伙伴儿,一键三连支持一下,后期会有持续更新!!抱拳了罒ω罒

1. 工厂模式简介

  工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。主要有三种不同实现方式:简单工厂模式,工厂方法模式,抽象工厂模式。
  应用实例: 您需要一部手机,可以直接从工厂里面提货,而不用去管这部手机是怎么做出来的,以及这个手机里面的具体实现。

2. 简单工厂模式

  该模式对对象创建管理方式最为简单,该模式通过向工厂传递类型来指定要创建的对象。

下面我们使用门的生产来讲解该模式:
Door接口:门生产的标准规范接口

 public interface Door{ 
     void make();
 }

WoodDoor 类:生产木门的类

 class WoodDoor implements Door{

     @Override
     public void make() {
         System.out.println("生产一扇木门");
     }
 }

IronDoor 类:生产铁门的类

class IronDoor implements Door{

    @Override
    public void make() {
        System.out.println("生产一扇铁门");
    }
}

DoorFactory类:工厂类,生产不同的门。

class DoorFactory{
    public Door makeDoor(String type) {
        if (type.equalsIgnoreCase("wood")){
            return new WoodDoor();
        }else if (type.equalsIgnoreCase("iron")){
            return new IronDoor();
        }else return null;
    }
}

测试程序

public class test {
    public static void main(String[] args) {
        DoorFactory df = new DoorFactory();
        Door wood = df.makeDoor("wood");
        Door iron = df.makeDoor("iron");
        wood.make();//生产一扇木门
        iron.make();//生产一扇铁门
    }
}

  如果我们还需要生产不锈钢门,那么就需要在DoorFactory类中添加添加相应的判断逻辑(增加if判断)。那么这样就会修改了原有的代码,违背了设计模式的开闭原则(对扩展开放,对修改关闭),这样就会每次扩展功能的时候都需要对工厂类进行修改,增加了开销。

3. 工厂方法模式

  工厂方法模式将生成具体产品的任务分发给具体的产品工厂,也就是定义一个抽象工厂,但不负责具体的产品,将生产任务交给不同的派生类工厂。

其中和产品相关的Door接口、WoodDoor 类和IronDoor 类的定义不变。
AbstractFactory接口:生产不同产品的工厂的抽象类(接口)

public interface AbstractFactory{ 
     Door makeDoor();
 }

WoodFactory:生产木门的工厂

class WoodFactory implements AbstractFactory{

    @Override
    public Door makeDoor() {
        return new WoodDoor();
    }
}

IronFactory:生产铁门的工厂

class IronFactory implements AbstractFactory{

    @Override
    public Door makeDoor() {
        return new IronDoor();
    }
}

演示:

public class test {
    public static void main(String[] args) {
        AbstractFactory wdf = new WoodFactory();
        AbstractFactory idf = new IronFactory();
        Door wooddoor = wdf.makeDoor();
        Door irondoor = idf.makeDoor();
        wooddoor.make();//生产一扇木门
        irondoor.make();//生产一扇铁门
    }
}

  符合开闭原则,如果我们还需要生产不锈钢门,只需要增加具体的产品类(和具体的⼯⼚类,不需要修改原有的代码;
  符合单⼀职责原则,每个⼯⼚只负责⽣产对应的产品;

4. 抽象工厂模式

  上面两种模式不管工厂怎么拆分抽象,都只是针对一类产品,抽象工厂模式通过在抽象工厂中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,从而实现多类产品。即工厂方法模式实现单个产品(实现门),抽象工厂模式实现多个产品(实现门和窗)
在这里插入图片描述接下来使用生产门和窗户的例子来讲解该模式。
其中和门相关的Door接口、WoodDoor 类和IronDoor 类的定义不变。增加产品窗户的生产的相关类和接口。
Window接口:门生产的标准规范接口

interface Window{
    void make();
}

WoodWindow 类:生产木窗的类

class WoodWindow implements Window{

    @Override
    public void make() {
        System.out.println("生产一个木窗");
    }
}

IronWindow 类:生产铁窗的类

class IronWindow implements Window{

    @Override
    public void make() {
        System.out.println("生产一个铁窗");
    }
}

下面需要修改工厂相关的类的定义:
AbstractFactory类:增加窗户产品制造接口

interface AbstractFactory{
    public Door makeDoor();
    public Window makeWindow();
}

WoodFactory类:增加木质窗户的制造

class WoodFactory implements AbstractFactory{

    @Override
    public Door makeDoor() {
        return new WoodDoor();
    }

    @Override
    public Window makeWindow() {
        return new WoodWindow();
    }
}

IronFactory 类:增加铁质窗户的制造

class IronFactory implements AbstractFactory{

    @Override
    public Door makeDoor() {
        return new IronDoor();
    }

    @Override
    public Window makeWindow() {
        return new IronWindow();
    }
}

演示:

public class test {
    public static void main(String[] args) {
        AbstractFactory wdf = new WoodFactory();
        AbstractFactory idf = new IronFactory();
        
        Door wooddoor = wdf.makeDoor();
        Door irondoor = idf.makeDoor();
        wooddoor.make();//生产一扇木门
        irondoor.make();//生产一扇铁门
        
        Window woodwindow = wdf.makeWindow();
        Window ironwindow = idf.makeWindow();
        woodwindow.make();//生产一个木窗
        ironwindow.make();//生产一个铁窗
    }
}

总结

上面介绍的三种工厂模式有各自的应用场景,实际应用时能解决问题满足需求即可,可灵活变通,无所谓高级与低级。

参考文章:
https://www.cnblogs.com/yssjun/p/11102162.html
https://csp1999.blog.csdn.net/article/details/117635224

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

corlor_龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值