23种设计模式之工厂方法模式
其实工厂模式有三种,因为简单工厂模式(Simple Factory)不属于23种设计模式之一,故将其放在一起阐述。
简单工厂模式(Simple Factory Principle)
定义:由一个工厂对象决定创建出哪一种产品的实例,将对象的创建过程交给工厂去管理,用的时候通过工厂去生成获得 ,也是最简单的生产者-消费者模型的体系。
代码:
//产品接口
public interface ICourse{
void study();
}
//产品1
public class JavaCourse implement ICourse {
void study(){
System.out.println("正在学习Java 课程!");
}
}
//产品2
public class PythonCourse implement ICourse {
void study(){
System.out.println("正在学习Python 课程!");
}
}
//产品工厂(通过传入实际需要创建的产品类生产实际的产品)
public class CourseFactory{
ICourse getCourse(Class clazz) throws Exception{
if(null != clazz){
return (ICourse)clazz.newInstance();
}
}
}
优点: 将有可能对象复杂的创建过程封装起来,提高了代码的可读性和可维护性,减少了代码的冗余度。
缺点:工厂类的职责相对过重,增加新产品时需要修改工厂类的创建逻辑,违背了开闭原则,不易于扩展更复杂的业务场景,兼容性和稳定性较差。
工厂方法模式 (Factory Method Principle)
定义:定义一个创建产品对象的接口,但让实现这个接口的类来决定实例化哪个类,让产品实例化推迟到子类中进行。
代码:假设还是上面的课程产品为例,但是需要定义课程工厂接口。
//产品工厂接口
public interface ICourseFactory{
ICourse getCourse();
}
// Java产品工厂
public class JavaCourseFactory implements ICourseFactory {
ICourse getCourse(){
retrun new JavaCourse();
}
}
//python产品工厂
public class PythonCourseFactory implements ICourseFactory {
ICourse getCourse(){
retrun new PythonCourse();
}
}
每一个具体的工厂去创建具体的产品,如果有新课程产品,我们只需要新增新的课程产品工厂就可以完成业务扩展。
优点:工厂方法模式时简单工厂的升级
1.有所有简单工厂的优点
2.每一工厂只负责创建一种产品,符合单一职责原则。
3.业务扩展不需要修改原代码,符合开闭原则。
缺点:创建对象需要较多冗余的代码,项目体积变大,类对象增加浪费资源,系统维护成本高。
以下是随手写的一个对于跨境支付场景的一个应用,因为实际生产环境中工厂类都是单例的,所以不具备太多实际的应用价值,只是作为一个参考,实际开发中对于支付会有更多复杂的场景,比如支付工厂,通道工厂,创建支付上下文,支付流程模板,支付前后验证回调,支付网关,风险预警规则,等等后续一系列的的大型复杂场景,不是没有实际需求的情况下能考虑的全面的。
代码地址:http://120.77.238.200:5566/tuanzi/gpwork/tree/master/pattern/src/main/java/org/stu/pattern/pay
类图:
v1:版本

v2:


浙公网安备 33010602011771号