工厂方法模式

工厂方法

引入的原因:

简单工厂模式违背了开闭原则,而“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。

  • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。

  • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点

  • 类的个数容易过多,增加复杂度

  • 增加了系统的抽象性和理解难度

  • 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。

代码示例

产品(Product)接口


public interface MachineApi {
        //process:加工      material:材料
    public void process(String material);
    
}

具体产品

public class SteamedBunMachine implements MachineApi {
    @Override
    public void process(String material) {
        System.out.println("我把" + material + "加工成了馒头");
    }
}


public class BoodleMachine implements MachineApi {
    @Override
    public void process(String material) {
        System.out.println("我把" + material + "加工成了面条");
    }
}

抽象工厂

public abstract class Factory{
    /**
     * 让子类(具体工厂)来实例化具体对象(机器)
     */
    public abstract MachineApi newMachine();
    
    /**
     * 加工材料
     */
    public void process(String material){
        MachineApi machine = newMachine();
        machine.process(material);
    }
    
}

对应的产品的生产工厂

public class SteamedBunFactory extends Factory{
    //馒头工厂,只需要提供馒头机器就行
    @Override
    public MachineApi newMachine() {
        return new SteamedBunMachine();
    }
}


public class NoodleFactory extends Factory{
    //面条工厂,只需要提供面条机器就行
    @Override
    public MachineApi newMachine() {
        return new BoodleMachine();
    }
}

生产的信息

SteamedBunFactory mSteamedBunFactory  = new SteamedBunFactory ();
mSteamedBunFactory.process("面粉");//我把面粉加工成了馒头
posted @ 2021-07-08 01:42  King-DA  阅读(34)  评论(0)    收藏  举报