设计模式-工厂方法模式

84 阅读2分钟

工厂方法模式(Factory Method Pattern)又叫虚拟构造函数(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建性工作推迟到子类中

工厂模式的分类

  • 简单工厂模式

    一个工厂类处于对产品类实例化的中心位置上,它知道每一个产品,决定哪一个产品类应该被实例化。

    • 优点:允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无需修改客户端,即在某种程度上支持"开闭"原则

    • 缺点:对“开闭”原则支持不够,如果有新产品加入到系统中,需要修改工厂类。

      总结:工厂实现产品的实例化,产品变化导致工厂类的变化。

  • 工厂方法模式

    核心的工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做。此核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪个产品类应当被实例化的细节。

    • 优点:进一步抽象,允许系统在不修改具体工厂角色的情况下引进新的产品
    • 缺点:只能针对一个产品等级结构
  • 抽象工厂模式

    具有一般性,需要面对多个产品等级结构

工厂模式具体实现

public interface FruitGardener {
    public Fruit Factory();
}

public interface Fruit {
    // 生长
    public void grow();
    // 收获
    public void harvest();
    // 栽种
    public void plant();
}
public class AppleGardener implements FruitGardener{
    @Override
    public Fruit Factory() {
        return new Apple();
    }
}

public class GrapeGardener implements FruitGardener{
    @Override
    public Fruit Factory() {
        return new Grape();
    }
}
public class Apple implements Fruit{
    private int treeAge;

    public int getTreeAge() {
        return treeAge;
    }

    public void setTreeAge(int treeAge) {
        this.treeAge = treeAge;
    }

    @Override
    public void grow() {
        System.out.println("苹果正在生长...");
    }

    @Override
    public void harvest() {
        System.out.println("收割苹果...");

    }

    @Override
    public void plant() {
        System.out.println("栽种苹果...");
    }
}
public class Grape implements Fruit{
    private boolean isSeedless;

    public boolean isSeedless() {
        return isSeedless;
    }
    
    public void setSeedless(boolean seedless) {
        isSeedless = seedless;
    }

    @Override
    public void grow() {
        System.out.println("葡萄正在生长...");
    }

    @Override
    public void harvest() {
        System.out.println("收割葡萄...");
    }

    @Override
    public void plant() {
        System.out.println("栽种葡萄...");
    }
}
public class Test {
    public static void main(String[] args) {
        // 通过苹果园丁生产葡萄
        AppleGardener appleGardener = new AppleGardener();
        Fruit apple = appleGardener.Factory();
        apple.plant();
        apple.grow();
        apple.harvest();

        // 通过葡萄园丁生成苹果
        GrapeGardener grapeGardener = new GrapeGardener();
        Fruit grape = grapeGardener.Factory();
        grape.plant();
        grape.grow();
        grape.harvest();

    }
}

image.png