工厂方法模式

1.介绍

它是定义一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类中。

2.小栗子

Pizza店做Pizza

3.代码实现

// Pizza抽象类
public abstract class Pizza {
    protected PizzaIngredientFactory factory = null;

    public Pizza(PizzaIngredientFactory factory) {
        this.factory = factory;
    }

    public abstract String getName();

    public void prepare() {
        System.out.println("Dough:" + factory.createDough().getName());
        System.out.println("Sauce:" + factory.createSauce().getName());
        System.out.println(this.getName() + " prepare success.");
    }
}

// 纽约Pizza
public class NYPizza extends Pizza {
    public NYPizza(PizzaIngredientFactory factory) {
        super(factory);
    }

    @Override
    public String getName() {
        return "NY Pizza";
    }
}

// 西雅图Pizza
public class SeattlePizza extends Pizza {
    public SeattlePizza(PizzaIngredientFactory factory) {
        super(factory);
    }

    @Override
    public String getName() {
        return "Seattle Pizza";
    }
}

// Pizza店 做Pizza
public abstract class PizzaStore {
    public void orderPizza(PizzaIngredientFactory factory) {
        Pizza pizza = createPizza(factory);
        pizza.prepare();
    }
    
    // 工厂方法模式
    protected abstract Pizza createPizza(PizzaIngredientFactory factory);
}

// 纽约PizzaStore
public class NYPizzaStore extends PizzaStore {
    @Override
    protected Pizza createPizza(PizzaIngredientFactory factory) {
        return new NYPizza(factory);
    }
}

4.测试

public class FactoryMethodPatternDemo {
    public static void main(String[] args) {
        PizzaIngredientFactory nyFactory = new NYPizzaIngredientFactory();
        PizzaIngredientFactory seattleFactory = new SeattlePizzaIngredientFactory();

        PizzaStore pizzaStore = new NYPizzaStore();
        pizzaStore.orderPizza(seattleFactory);

        pizzaStore.orderPizza(nyFactory);
    }
}

5.总结

纽约可以做纽约/西雅图等地区风格的Pizza,而且Pizza本身风格也是可以扩展的。

源码地址:https://gitee.com/jsjack_wang/JavaDemo

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,638评论 25 708
  • 简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建...
    justCode_阅读 1,216评论 1 9
  • 模式介绍 工厂方法模式是应用最广泛的模式之一,也是创建型模式之一。工厂方法模式指的是定义出一个用于创建对象的接口,...
    黑色小老虎丶阅读 707评论 0 2
  • 170427 早上开会讨论小组作业,要开始准备pre。其实有的时候能力有限,可还是想要承担相对更多的任务。 pre...
    XxXxXxN阅读 146评论 0 0
  • 概述 Xcode中的iOS 7图标大小概述。由于有相当多的iOS设备,它可以是一个特别苛刻与所有这些不同的分辨率。...
    弗利撒阅读 566评论 0 0