目录
一、应用场景
当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。
二、什么是工厂模式
定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交由工厂去生产,有良好的封装性,既做到了解耦,也保证了最少知识原则。
任何的设计模式都是用来解决某一些特定场景问题的一种思想,如果在开发过程中遇到某一些问题,可以回顾自己脑海中的所有知识,是不是可以使用设计模式去解决,当然自己也可以不用设计模式,用其他的方式也是可以的,只要能解决就可以
三、怎样写工厂模式
(一)简单工厂模式
1、代码编写
package com.fuping.liuqu.demo.design.pattern.factory;
public interface IFrontEndAngularModule {
void createRoute();
}
package com.fuping.liuqu.demo.design.pattern.factory;
public class ModeAngularModule implements IFrontEndAngularModule {
@Override
public void createRoute() {
System.out.println("this is mode route");
}
}
package com.fuping.liuqu.demo.design.pattern.factory;
public class NoteBookAngularModule implements IFrontEndAngularModule {
@Override
public void createRoute() {
System.out.println("this is notebook route");
}
}
package com.fuping.liuqu.demo.design.pattern.factory;
public class JobAngularModule implements IFrontEndAngularModule {
@Override
public void createRoute() {
System.out.println("this is job route");
}
}
package com.fuping.liuqu.demo.design.pattern.factory;
public class DataSetAngularModule implements IFrontEndAngularModule {
@Override
public void createRoute() {
System.out.println("this is dataset route");
}
}
package com.fuping.liuqu.demo.design.pattern.factory;
public class SimpleFactory {
// 数据源模块
public static final int TYPE_DATA_SET = 1;
// Notebook模块
public static final int TYPE_NOTEBOOK = 2;
// WorkFlow模块
public static final int TYPE_WORKFLOW = 3;
// 训练作业模块
public static final int TYPE_JOB = 4;
// 模型模块
public static final int TYPE_MODE = 5;
public static IFrontEndAngularModule createAngularModule(int type) {
switch (type) {
case TYPE_DATA_SET:
return new DataSetAngularModule();
case TYPE_NOTEBOOK:
return new NoteBookAngularModule();
case TYPE_WORKFLOW:
return new WorkFlowAngularModule();
case TYPE_JOB:
return new JobAngularModule();
case TYPE_MODE:
default:
return new ModeAngularModule();
}
}
}
package com.fuping.liuqu.demo.design.pattern.factory;
public class SimpleFactoryTest {
public static void main(String[] args) {
//简单工厂模式
IFrontEndAngularModule iFrontEndAngularModule = SimpleFactory.createAngularModule(SimpleFactory.TYPE_DATA_SET);
iFrontEndAngularModule.createRoute();
}
}
2、特点
工厂方法中用一个静态的方法去选择实现的类,大多数使用if-else、switch-case及策略模式。
3、优缺点
优点:逻辑简单,易于理解
缺点:扩展性差,新增模块类,还需要修改工厂
(二)复杂工厂模式
1、代码编写
package com.fuping.liuqu.demo.design.pattern.factory.complex;
public interface IBackEndModule {
void createRoute();
}
package com.fuping.liuqu.demo.design.pattern.factory.complex;
public interface IFrontEndModule {
void createRoute();
}
package com.fuping.liuqu.demo.design.pattern.factory.complex;
public class DataSetFrontEndModule implements IFrontEndModule {
@Override
public void createRoute() {
System.out.println("this is front end dataset route");
}
}
package com.fuping.liuqu.demo.design.pattern.factory.complex;
public class DataSetBackEndModule implements IBackEndModule {
@Override
public void createRoute() {
System.out.println("this is back end dataset route");
}
}
package com.fuping.liuqu.demo.design.pattern.factory.complex;
public interface IComplexFactory {
IFrontEndModule createFrontEndModule();
IBackEndModule createBackEndModule();
}
package com.fuping.liuqu.demo.design.pattern.factory.complex;
public class ComplexFactory implements IComplexFactory{
@Override
public IFrontEndModule createFrontEndModule() {
return new DataSetFrontEndModule();
}
@Override
public IBackEndModule createBackEndModule() {
return new DataSetBackEndModule();
}
}
package com.fuping.liuqu.demo.design.pattern.factory.complex;
public class ComplexFactoryTest {
public static void main(String[] args){
ComplexFactory complexFactory = new ComplexFactory();
complexFactory.createFrontEndModule().createRoute();
complexFactory.createBackEndModule().createRoute();
}
}
2、特点
产品族都属于同一类的不同等级。
3、优缺点
优点:抽象工厂模式可以在类的内部对产品族进行约束。
缺点:产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。