工厂方法模式(五)

过气的,终究是过气了

上一章简单介绍了工厂模式(四), 如果没有看过,请观看上一章

一.工厂方法模式

工厂方法模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。

组成角色 具体 关系 作用
抽象产品(Product) Pizza 具体产品的父类 描述具体产品的公共接口
具体产品(Concrete Product) Chinese1,Eluosi1 抽象产品的子类;工厂类创建的目标类 描述生产的具体产品
抽象工厂(Creator) AbsOrderPizzaFactory 具体工厂的父类 描述具体工厂的公共接口
具体工厂(Concrete Creator) ChineseAbsOrderPizzaFactoryFactory 等 抽象工厂的子类;被外界调用 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例

工厂方法模式(五)_第1张图片

二. 实例讲解

二.一 定义抽象产品

public interface Pizza {
    void make();
}

二.二 定义具体的产品

二.二.一 中国蓝色披萨

@Slf4j
public class ChineseBluePizza implements Pizza{

    @Override
    public void make() {
        log.info("制作中国蓝色披萨");
    }
}

二.二. 二 中国红色披萨

@Slf4j
public class ChineseRedPizza implements Pizza{

    @Override
    public void make() {
        log.info("制作中国红披萨");
    }
}

二.二. 三 俄罗斯蓝色披萨

@Slf4j
public class EluosiBluePizza implements Pizza{

    @Override
    public void make() {
        log.info("制作俄罗斯蓝色披萨");
    }
}

二.二. 四 俄罗斯红色披萨

@Slf4j
public class EluosiRedPizza implements Pizza{

    @Override
    public void make() {
        log.info("制作俄罗斯红披萨");
    }
}

二.三 定义抽象工厂

public  interface AbsOrderPizzaFactory {
     public Pizza createPizaa (String type);
}

二.四 定义具体的工厂

二.四.一 中国的工厂

public class ChineseAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {

    @Override
    public Pizza createPizaa(String type) {
        if ("red".equalsIgnoreCase(type)){
            return new ChineseRedPizza();
        }else if ("blue".equalsIgnoreCase(type)){
            return new ChineseBluePizza();
        }else {
            return null;
        }
    }
}

二.四.二 俄罗斯的工厂

public class EluosiAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {

    @Override
    public Pizza createPizaa(String type) {
        if ("red".equalsIgnoreCase(type)){
            return new EluosiRedPizza();
        }else if ("blue".equalsIgnoreCase(type)){
            return new EluosiBluePizza();
        }else {
            return null;
        }
    }
}

二.五 客户端调用

@Test
    public void oneTest() {

        AbsOrderPizzaFactory absOrderPizzaFactory = new ChineseAbsOrderPizzaFactoryFactory();

        Pizza pizza = absOrderPizzaFactory.createPizaa("red");

        pizza.make();

        pizza = absOrderPizzaFactory.createPizaa("blue");
        pizza.make();

        absOrderPizzaFactory =   new EluosiAbsOrderPizzaFactoryFactory();

        pizza = absOrderPizzaFactory.createPizaa("red");

        pizza.make();
    }

工厂方法模式(五)_第2张图片

二.六 新增加种类

如果现在新增加 美国的 蓝色 和红色 披萨, 那么不需要改变之前的东西, 只需要增加具体的产品和具体的工厂实现即可

二.六.一 新增加具体的产品

@Slf4j
public class MeiBluePizza implements Pizza{

    @Override
    public void make() {
        log.info("制作美国蓝色披萨");
    }
}
@Slf4j
public class MeiRedPizza implements Pizza{

    @Override
    public void make() {
        log.info("制作美国红披萨");
    }
}

二.六.二 新增加具体的工厂实现

public class MeiAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {

    @Override
    public Pizza createPizaa(String type) {
        if ("red".equalsIgnoreCase(type)){
            return new MeiRedPizza();
        }else if ("blue".equalsIgnoreCase(type)){
            return new MeiBluePizza();
        }else {
            return null;
        }
    }
}

二.六.三 客户端调用

@Test
    public void twoTest() {

        AbsOrderPizzaFactory absOrderPizzaFactory = new MeiAbsOrderPizzaFactoryFactory();

        Pizza pizza = absOrderPizzaFactory.createPizaa("red");

        pizza.make();

        pizza = absOrderPizzaFactory.createPizaa("blue");
        pizza.make();
        
    }

工厂方法模式(五)_第3张图片

工厂方法不支持 产品族, 只是生成一个单一的对象实例


本章节的代码放置在 github 上:


https://github.com/yuejianli/DesignPattern/tree/develop/MethodFactory


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

你可能感兴趣的:(设计模式,工厂方法模式,设计模式)