其他
百度工程师教你玩转设计模式(工厂模式)
作者 | 北极星小组
一、简单工厂模式在文档解析场景中的应用
简单工厂(SimpleFactory):是简单工厂模式的核心,这里负责实现创建所有具体Parser实例的内部逻辑。
抽象产品(Product):是简单工厂创建的所有对象的父类,这里负责描述所有Parser实例共有的公共接口。
具体产品(ConcreteProduct):是简单工厂模式的创建目标,这里负责创建具体的解析类。
public class DocxPaser {
//抽象产品:所有Parser共有的公共接口
public interface IPaser {
void process(string entity);
}
//具体产品:Paragraph Parser
static class Paragraph implements IPaser {
public void process(string entity) {
System.out.println("解析 Paragraph...");
}
}
//具体产品:Table Parser
static class Table implements IPaser {
public void process(string entity) {
System.out.println("解析 Table...");
}
}
//具体产品:Draw Parser
static class Draw implements IPaser {
public void process(string entity) {
System.out.println("解析 Draw...");
}
}
final class Const {
static final int ENTITY_PARAGRAPHP = 0;
static final int ENTITY_TABLE = 1;
static final int ENTITY_DRAW = 2;
}
//简单工厂:负责实现创建所有具体Parser实例的内部逻辑
static class ParserFactory {
public static IPaser creatParser(int kind) {
switch (kind) {
case Const.ENTITY_PARAGRAPHP:
return new Paragraph();
case Const.ENTITY_TABLE:
return new Table();
case Const.ENTITY_DRAW:
return new Draw();
}
return null;
}
}
// 简单使用示例
public static void main(String[] args) {
//entity 对应document.xml 此处略去具体获取过程
...
//解析paragraph
ParserFactory.creatParser(Const.ENTITY_PARAGRAPHP).process(entity)
//解析table
ParserFactory.creatParser(Const.ENTITY_TABLE).process(entity)
//解析draw
ParserFactory.creatParser(Const.ENTITY_DRAW).process(entity)
...
}
}
二、工厂方法模式在自动化测试场景的应用
由于后续每次新增一种对象都需要修改工厂类中的判断逻辑,违反代码设计中的开闭原则
由于需要对输入的参数进行判断然后初始化合适的类,简单工厂类中 if-else 或者 switch-case分支过多,代码显得较为臃肿
开闭原则:新增对象的情况下,简单工厂模式下需要修改工厂类,而工厂方法模式只需要新增一个工厂的子类去完成新增对象的初始化即可。
代码简洁:简单工厂通过参数选择并初始化子类,所有工作都由工厂类完成,工厂方法只是定义了一个创建对象的接口,对象的创建放在子类去实现。
public class FactoryDemo {
//抽象对象:所有驱动对象的公共父类
abstract static class Driver {
abstract void process();
}
// 具体驱动对象:Chrome浏览器驱动对象
static class ChromeDriver extends Driver {
@Override
void process() {
System.out.println("ChromeDriver process"); // do something
}
}
// 具体驱动对象:Firefox浏览器驱动对象
static class FirefoxDriver extends Driver {
@Override
void process() {
System.out.println("FirefoxDriver process"); // do something
}
}
// 具体驱动对象:Safari浏览器驱动对象
static class SafariDriver extends Driver {
@Override
void process() {
System.out.println("SafariDriver process"); // do something
}
}
// 抽象工厂 所有工厂的公共接口
public interface AbstractFactory {
Driver create();
}
// 具体工厂:负责Chrome浏览器驱动对象的创建
static class ChromeDriverFactory implements AbstractFactory {
@Override
public Driver create() {
return new ChromeDriver();
}
}
// 具体工厂:负责Firefox浏览器驱动对象的创建
static class FirefoxDriverFactory implements AbstractFactory {
@Override
public Driver create() {
return new FirefoxDriver();
}
}
// 具体工厂:负责Safari浏览器驱动对象的创建
static class SafariDriverFactory implements AbstractFactory {
@Override
public Driver create() {
return new SafariDriver();
}
}
public static void main(String[] args) {
// 创建 Chrome 驱动对象
AbstractFactory chromeDriverFactory = new ChromeDriverFactory();
Driver chromeDriver = chromeDriverFactory.create();
chromeDriver.process();
// 创建 Firefox 驱动对象
AbstractFactory firefoxDriverFactory = new FirefoxDriverFactory();
Driver firefoxDriver = firefoxDriverFactory.create();
firefoxDriver.process();
// ...
}
}
三、抽象工厂模式在跨端场景下的应用
//抽象产品
public interface Vip {}
//具体产品
public class NormalVip implements Vip {} //普通会员
public class MonthlyVip implements Vip {} //包月会员
public class IOSNormalVip extends NormalVip {}
public class AndroidNormalVip extends NormalVip {}
public class PCNormalVip extends NormalVip {}
public class IOSMonthlyVip extends MonthlyVip {}
public class AndroidMonthlyVip extends MonthlyVip {}
public class PCMonthlyVip extends MonthlyVip {}
//抽象工厂
public interface AbstractVipFactory {
Vip createNormalVip();
Vip createMonthlyVip();
}
//具体工厂
public class IOSVipFactory implements AbstractVipFactory {
@Override
public Vip createNormalVip() {
return new IOSNormalVip();
}
@Override
public Vip createMonthlyVip() {
return new IOSMonthlyVip();
}
}
...
//调用示例
public class Client {
public static void main(String[] args) {
IOSVipFactory iosVipFactory = new IOSVipFactory();
Vip iosNormalVip = iosVipFactory.createNormalVip();
}
}
四、总结
简单工厂模式:实例化过程复杂时,可以选用
工厂方法模式:产品结构较复杂时,可以选用
抽象工厂模式:产品种类结构多时,可以选用