java设计模式系列1——简单工厂模式

注:简单工厂模式不在23种设计模式中,可用于辅助理解工厂方法模式、抽象工厂模式

简单工厂模式

适用场景
  • 工厂类负责创建的对象比较少
  • 客户端(应用层)只知道传入工厂类的参数对于如何创建对象(逻辑)不关心
实现步骤
  1. 创建抽象产品类,里面有产品的抽象方法,由具体的产品类去实现
  2. 创建具体产品类,继承了他们的父类,并实现具体方法
  3. 创建工厂类,提供了一个静态方法createXXX用来生产产品,只需要传入你想产品名称
具体实现

抽象支付类

/**
 * @author CV大魔王
 * @Description 抽象支付类
 * @date 2021/4/9 8:05
 */
public interface Pay {
    void unifiedorder();
}

具体实现类,支付宝支付

/**
 * @author CV大魔王
 * @Description 支付宝支付
 * @date 2021/4/9 8:07
 */
public class AliPay implements Pay{
    @Override
    public void unifiedorder() {
        System.out.println("支付宝支付 统一下单接口");
    }
}

具体实现类,微信支付

/**
 * @author CV大魔王
 * @Description 微信支付
 * @date 2021/4/9 8:07
 */
public class WechatPay implements Pay{
    @Override
    public void unifiedorder() {
        System.out.println("微信支付 统一下单接口");
    }
}

创建简单工厂类

/**
 * @author CV大魔王
 * @Description 简单支付工厂类
 * @date 2021/4/9 8:10
 */
public class SimplePayFactory {

    /**
     * 根据参数返回对应的支付对象
     * @param payType 参数
     * @return 具体的支付对象
     */
    public static Pay createPay(String payType) {
        if (payType == null) {
            return null;
        }

        if (payType.equalsIgnoreCase("WECHAT_PAY")) {
            return new WechatPay();
        } else if (payType.equalsIgnoreCase("ALI_PAY")) {
            return new AliPay();
        }
        return null;
    }
}

使用:

public class Main {
    public static void main(String[] args) {
        Pay pay = SimplePayFactory.createPay("WECHAT_PAY");
        pay.unifiedorder();
    }
}
小结

优点:

  • 将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。
  • 只需要传入一个正确的参数,就可以获取你所需要的对象而无须知道其创建细节

缺点

  • 工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背
  • 即开闭原则(Open ClosePrinciple)对扩展开放,对修改关闭,程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果
  • 将会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度,不利于系统的扩展和维护,创建简单对象就不用模式
  • 工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则
辅助理解

以前我们使用是这样的:

Pay pay = new WechatPay();
pay.unifiedorder();

使用了简单工厂模式

Pay pay = SimplePayFactory.createPay("WECHAT_PAY");
pay.unifiedorder();

不一定要使用接口,使用抽象类也是可以的。
白话文理解作用:调用工厂类后我们不需要导入具体的包,只需要导入正确的工厂方法即可。

练习

在线教育视频网站,定义一个Video抽象类,Video定义一个抽象方法。两个实现类,分别是获取java相关和Python相关,最后一个简单工厂类。

public abstract class Video {

    /**
     * 寻找相关视频
     */
    public abstract void produce();
}

java实现类

public class JavaVideo extends Video{
    @Override
    public void produce() {
        System.out.println("录制java相关视频");
    }
}

Python实现类

public class PythonVideo extends Video{
    @Override
    public void produce() {
        System.out.println("录制Python相关视频");
    }
}

工厂

public class VideoFactory {

    public Video getVideo(String type) {
        if ("java".equalsIgnoreCase(type)){
            return new JavaVideo();
        }else {
            return new PythonVideo();
        }
    }
}

使用:

@Test
public void test01(){
    VideoFactory videoFactory = new VideoFactory();
    Video video = videoFactory.getVideo("java");
    video.produce();
}

如果觉得对你有帮助,点个赞再走吧。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CV大魔王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值