工厂模式 简单的来说就 我们需要的对象不由我们手动new出来,而是使用工厂对象加工出来.
而工厂模式又分为 简单工厂 工厂方法 抽象工厂等多种类型 本章主要通过例子讲解简单工厂模式
简单工厂模式指的是 由一个工厂对象决定创建哪一种产品类的实例.
简单工厂模式适用于工厂类负责创建的对象较少的场景,而且客户端只需要传入工厂类的参数,对于如何创建对象不需要关心.
缺点在于 工厂类的职责相对过重 不太易于拓展过于复杂的产品结构.
举个例子
根据实际业务 需要产生两个不同地区的员工对象
没有使用工厂模式的代码 如下
/**
* IWorker 是所有地区员工的父接口
*
* 深圳员工 武汉员工 都实现 IWorker
* */
public static void main(String[] args) {
// 深圳子公司业务需要生成深圳员工 并工作
IWorker shenZhen = new ShenZhenWorker();
shenZhen.work();
// 武汉子公司业务需要生成武汉员工 并工作
IWorker wuHan = new WuHanWorker();
wuHan.work();
}
如果此时需求更新 武汉员工出差到深圳 子公司业务需要通过员工的籍贯住址生成不同的员工去工作,或者子公司业务需要在生产员工前先签署不同的劳务合同,在那么直接写死在代码中的new ShenZhenWork();就需要修改,如果业务庞大 需要修改的代码有几百处,那这个工作量可想而知的大,此时可以考虑使用工厂模式
下面是简单工厂模式的一个简单实例
public class WorkerFactory {
public IWorker create(String addr){
IWorker worker = null;
if("深圳".equals(addr)){
worker = new ShenZhenWorker();
worker.contract("劳务合同");
return worker;
}else if("武汉".equals(addr)){
worker = new WuHanWorker();
worker.contract("外包合同");
return worker;
}
return worker;
}
}
public static void main(String[] args) {
// 简单工厂模式
ReportWorkerFactory factory = new ReportWorkerFactory();
factory.create("深圳").work();
factory.create("武汉").work();
}
此时子公司就可以通过 员工工厂生产出对应的员工(工厂根据实际条件生产不同的对象),
以及签署不同的合同(在生产对象时对对象进行初始化定制化)
此时的工厂也是一个对象 需要new出来,根据实际业务,可以将工厂转变为静态工厂
public class WorkerFactory {
public static IWorker create(String addr){
IWorker worker = null;
if("深圳".equals(addr)){
worker = new ShenZhenWorker();
worker.contract("劳务合同");
return worker;
}else if("武汉".equals(addr)){
worker = new WuHanWorker();
worker.contract("外包合同");
return worker;
}
return worker;
}
}
public static void main(String[] args) {
// 静态工厂模式
ReportWorkerFactory.create("深圳").work();
ReportWorkerFactory.create("武汉").work();
}
但是此时如果我们业务继续拓展,新成立了一个广州分公司.那么工厂中的create方法就要每次根据业务的拓展不断增加与修改代码的逻辑,不符合代码开闭原则.因此我们还可以对简单工厂进行改造优化,采用反射技术.
这样优化之后,业务的不断拓展的过程中不需要修改WorkerFactory中的代码
public class WorkerFactory {
public static IWorker create(Class<? extends IWorker> clazz){
try {
if(null != clazz){
clazz.newInstance();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
// 静态工厂模式
ReportWorkerFactory.create(ShenZhenWorker.class).work();
ReportWorkerFactory.create(WuHanWorker.class).work();
}
此时查看一下具体的类图 如下
类关系图