6月更文挑战|设计模式 —— 工厂方法模式

221 阅读2分钟

这是我参与更文挑战的第5天,活动详情查看:更文挑战

工厂方法模式

工厂方法模式是对简单工厂模式进一步抽象化,在保证系统原逻辑不被破坏的前提下扩展新产品,满足开闭原则。

工厂模式主要分为四大模块:抽象工厂、具体工厂、抽象产品、具体产品。

  1. 抽象产品:Computer就是抽象产品,实现产品基本功能,所生产的产品需要满足实现该抽象产品的所有功能。
  2. 具体产品:Dell、Asus就是抽象产品的具体实现。
  3. 抽象工厂:ComputerFactory就是抽象工厂,提供创造产品的抽象接口。
  4. 具体工厂:实现ComputerFactory抽象工厂的抽象接口具体方法的实体类。
public abstart class Computer{
    public abstract void bootUp();
}

public class Dell extends Computer{
    @Override
    public void bootUp(){
        ....
    }
}

public class Asus extends Computer{
    @Override
    public void bootUp(){
        ....
    }
}

public abstart class ComputerFactory{
    public abstract Computer createComputer();
}

多工厂形式实现

为每个产品创建自己的工厂类,每个工厂各司其职只生产对应型号的Computer。当然也可以省略掉多工厂模式。

public AsusFactory extends ComputerFactory{
    @Override
    public Computer createComputer(){
        Asus asus = new Asus();
        return asus;
    }    
}

public DellFactory extends ComputerFactory{
    @Override
    public Computer createComputer(){
        Dell dell = new Dell();
        return dell;
    }    
}
DellFactory dellFactory = new DellFactory();
Computer dellComputer = dellFactory.createComputer();
dellComputer.bootUp();

AsusFactory asusFactory = new AsusFactory();
Computer asusComputer = asusFactory.createComputer();
asusComputer.bootUp();

开始之前说明下在设计模式 —— 开篇有介绍过开闭原则,简单工厂模式将工厂类作为一个总工厂,一旦新增产品就需要修改工厂类的方法逻辑,违背了开闭原则。之所以工厂方法模式符合原则就是新增产品不需要修改工厂类逻辑只需增加新工厂子类。

/// 静态工厂类
public class TotalComputerFactory{
    public Computer createAsusComputer(){
        return new Asus();
    }
    public Computer createDellComputer(){
        return new Dell();
    }
}

反射形式实现

可以利用反射方式创建具体对象,在ComputerFactory的方法createComputer传入一个Class类决定创建哪个具体Computer。

public abstract class ComputerFactory{
    public abstarct <T extends Computer> T crateComputer(Class<T> clz);
}


public class TotalComputerFactory extends ComputerFactory{
    @Override
    public <T extends Computer> T createComputer(Class<T> clz){
        Computer computer = null;
        try{
            p = (Computer) Class.fromName(clz.getName().newInstance());
        }catch (Exceotion e){
            //....
        }
        return (T)computer;
    }      
}

TotalComputerFactory computerFactory = new TotalComputerFactory();
Computer computer = computerFactory.createComputer(Dell.class);
computer.bootUp();

总结

工厂方法模式在简单工厂模式的基础上增加了工厂抽象,对于后期扩展新产品线时只需要实现继承抽象工厂类,新增一个产品工厂和产品线即可完成产品升级工作。在不破坏原程序结构前提下,自由扩展产品线符合设计模式基本原则。但同时工厂方法也存在一个问题,每新增一种产品就相对性生成新工厂和新产品,一个实例工厂只能对应一种产品的情况。