注:简单工厂模式不在23种设计模式中,可用于辅助理解工厂方法模式、抽象工厂模式
简单工厂模式
适用场景
- 工厂类负责创建的对象比较少
- 客户端(应用层)只知道传入工厂类的参数对于如何创建对象(逻辑)不关心
实现步骤
- 创建抽象产品类,里面有产品的抽象方法,由具体的产品类去实现
- 创建具体产品类,继承了他们的父类,并实现具体方法
- 创建工厂类,提供了一个静态方法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();
}
如果觉得对你有帮助,点个赞再走吧。