PS: 年初换了一家公司,在这期间基于SpringBoot和SpringCloud搭建了一套环境用于重构公司的某接口系统,现已上线;
在这过程中,很多共用的模块,实现的功能需要抽象和封装,但是在面向对象设计这块非常薄弱,
导致在搭建系统的时候花了非常多的时间去考虑该怎么设计以达到系统的后期可维护和可扩展。
所以决定将设计模式再学习和研究一遍(基于《研磨设计模式》这本书)
简单工厂模式,不是Gof拿23种设计中的模式,但是用来过度还是很不错
1. 定义
提供一个创建对象实例的功能,而无须关心具体的实现,被创建的实例可以是接口,抽象类,或者具体的类.
2. 解决的问题
使用者无须关心具体的创建过程,只需要调用工厂创建自己需要的实例,这是封装并隔离的思想.
3. 例子
我是一个轮滑(花式刹停)爱好者,所以后面的例子都会基于轮滑的例子来说明;比如生产一双轮滑鞋,我不需要关心这双轮滑鞋具体怎么生产的,我只需要通过轮滑工厂去创建就行,同样为了加入接口隔离的思想,例子这里使用接口来实现。
接口:定义一个轮滑厂商接口,有一个创建轮滑鞋的方法.
实现接口类:圣巴轮滑厂商,Evo轮滑厂商分别实现接口,(这两个是国外高端轮滑鞋生产厂商).
工厂类:根据参数返回具体的厂商
Main:测试调用
类图:
4. 示例代码
package com.bufoon.test.gof.simpleFactory;
/**
* 轮滑厂商接口
* @ClassName: SkateVendorI
* @Description: 轮滑厂商接口,定义了一个创建轮滑鞋的方法
* @author anling.song
* @date 2017年7月6日 上午11:35:22
*/
public interface SkateVendorI {
/**
* 创建轮滑鞋
*/
public void createSkate();
}
package com.bufoon.test.gof.simpleFactory;
/**
* 轮滑厂商实现类
* @ClassName: EvoSkateVendorImpl
* @Description: Evo 轮滑厂商实现类
* @author anling.song
* @date 2017年7月6日 上午11:39:26
*/
public class EvoSkateVendorImpl implements SkateVendorI {
public void createSkate() {
System.out.println("EVO轮滑:创建一双EVO轮滑");
}
}
package com.bufoon.test.gof.simpleFactory;
/**
* 轮滑厂商实现类
* @ClassName: SebaSkateVendorImpl
* @Description: 实现类圣巴轮滑厂商
* @author anling.song
* @date 2017年7月6日 上午11:36:53
*/
public class SebaSkateVendorImpl implements SkateVendorI {
@Override
public void createSkate() {
System.out.println("圣巴轮滑:创建一双SEBA轮滑");
}
}
package com.bufoon.test.gof.simpleFactory;
/**
* 工厂类
* @ClassName: SkateFactory
* @Description: 用于创建轮滑厂商实例
* @author anling.song
* @date 2017年7月6日 下午1:36:03
*/
public class SkateFactory {
/**
* 创建轮滑厂商实例
* @param cause
* @return
*/
public static SkateVendorI newSkateVendor(int cause){
SkateVendorI skateVendor = null;
switch (cause) {
case 1:
skateVendor = new SebaSkateVendorImpl();
break;
case 2:
skateVendor = new EvoSkateVendorImpl();
break;
default:
skateVendor = new SebaSkateVendorImpl();
}
return skateVendor;
}
}
package com.bufoon.test.gof.simpleFactory;
public class Main {
public static void main(String[] args) {
SkateVendorI skateVendor1 = SkateFactory.newSkateVendor(1);
skateVendor1.createSkate();
SkateVendorI skateVendor2 = SkateFactory.newSkateVendor(2);
skateVendor2.createSkate();
}
}
输出:
圣巴轮滑:创建一双SEBA轮滑
EVO轮滑:创建一双EVO轮滑
5. 思考
a. 不好扩展,如果需要创建其它实例,需要修改代码(不过可以根据配置文件用反射去创建实例);
b. 由于实现类可能会非常多,这里就需要加非常多的分支判断;