美文网首页
Chapter4 工厂模式

Chapter4 工厂模式

作者: 小麻巧吃西瓜 | 来源:发表于2019-07-19 12:14 被阅读0次

简单工厂模式:

使用工厂处理创建对象的细节。
其实它并非一个真正的设计模式,而是一种编程习惯。

例如:


若菜单改变则实例化过程需要修改,若菜单一再改变,则需要不断修改,不符合OO原则。所以简单工厂“模式”的做法是创建一个新的对象,叫做“工厂(factory)”来存储处理创建对象的细节。

改为:

public class SimplePizzaFactory {

    public Pizza createPizza(String type) {
        Pizza pizza = null;

        if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni")) {
            pizza = new PepperoniPizza();
        } else if (type.equals("clam")) {
            pizza = new ClamPizza();
        } else if (type.equals("veggie")) {
            pizza = new VeggiePizza();
        }
        return pizza;
    }
}
public class PizzaStore {
    SimplePizzaFactory factory;
 
    public PizzaStore(SimplePizzaFactory factory) { 
        this.factory = factory;
    }
 
    public Pizza orderPizza(String type) {
        Pizza pizza;
 
        pizza = factory.createPizza(type);
 
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }

}

UML类图:

image.png

工厂方法:

处理对象的创建,并将这样的行为封装在子类中。这样,父类的代码和子类对象创建代码就解耦了。
Abatract Product factoryMethod(String type)

  • 工厂方法是抽象的,依赖子类来具体创建对象。
public abstract class PizzaStore {
 
    abstract Pizza createPizza(String item);
 
    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);
        System.out.println("--- Making a " + pizza.getName() + " ---");
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

在不同的pizza店(子类)里具体地实现createPizza方法(工厂方法):

public class ChicagoPizzaStore extends PizzaStore {

    Pizza createPizza(String item) {
            if (item.equals("cheese")) {
                    return new ChicagoStyleCheesePizza();
            } else if (item.equals("veggie")) {
                    return new ChicagoStyleVeggiePizza();
            } else if (item.equals("clam")) {
                    return new ChicagoStyleClamPizza();
            } else if (item.equals("pepperoni")) {
                    return new ChicagoStylePepperoniPizza();
            } else return null;
    }
}

工厂方法模式的定义:工厂模式用于封装对象的创建,让子类进行具体的对象创建,来达到将对象创建的过程封装的目的。


工厂模式的正式定义:

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

UML类图:


(与实例相对应,Product为Pizza,Creator为PizzaStore,factoryMethod()方法为createPizza()方法。)

抽象工厂模式:

定义:

提供一个接口,用来创建相关或依赖对象的家族,而不需要明确指定具体类。
允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么。

UML类图:

实例类图:


PizzaIngredientFactory为定义的抽象工厂定义的接口,NYPizzaIngredientFactory是抽象工厂接口的一个具体实现,NYPizzaStore是一个客户,客户代码中仅设计抽象工厂,实例化了它的一个具体实现,通过这个具体实现来决定一个pizza的具体配方。
        PizzaIngredientFactory ingredientFactory = 
            new NYPizzaIngredientFactory();

(节选自NYPizzaStore.java


对比:

工厂方法和抽象工厂模式把都可以把特定实现从应用程序中解耦,但是具体的实现过程是不一样的。
在创建对象的时候前者使用的是类的继承,而后者使用的是组合。


本章要点:

  • 所有工厂都是用来封装对象的创建。
  • 简单工厂不是一种真正的模式。
  • 工厂方法是子类实现工厂方法来创建对象。
  • 抽象工厂使用对象的组合来创建对象,在工厂接口所暴露出来的方法中实现对象的创建。
  • 依赖倒置原则,避免依赖具体类型,尽量依赖抽象。

相关文章

  • Chapter4 工厂模式

    简单工厂模式: 使用工厂处理创建对象的细节。其实它并非一个真正的设计模式,而是一种编程习惯。 例如: 若菜单改变则...

  • 常用设计模式

    设计模式 工厂模式 工厂模式思路上分:简单工厂模式,工厂模式, 抽象工厂模式// 抽象工厂模式可以代替工厂模式,做...

  • 工厂模式

    工厂模式细分三种:简单工厂模式、工厂模式、抽象工厂模式。 工厂模式相当于抽象了简单工厂模式的工厂类,而抽象工厂模式...

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • 找女朋友之简单工厂模式,工厂模式,抽象工厂模式

    找女朋友之简单工厂模式,工厂模式,抽象工厂模式 找女朋友之简单工厂模式,工厂模式,抽象工厂模式

  • 【设计模式】- 工厂模式

    工厂模式分为三种:简单工厂模式、工厂方法模式和抽象工厂模式。 工厂模式:靠工厂生产对象 简单工厂模式中只有一个工厂...

  • 工厂模式

    工厂模式包含三种模式:简单工厂模式、工厂方法模式和抽象工厂模式。 简单工厂模式 定义简单工厂模式:由一个工厂类根据...

  • Java设计模式——工厂模式

    工厂模式简单工厂模式工厂方法模式抽象工厂模式 1.简单工厂模式 1.基本介绍1)简单工厂模式也叫静态工厂模式,是属...

  • 设计模式-3种工厂模式

    工厂模式包括:简单工厂模式,工厂方法模式,抽象工厂模式 简单工厂模式 工厂方法根据参数直接创建实例:工厂->产品 ...

  • 设计模式-工厂模式

    工厂模式概念 实例化对象,用工厂方法代替new操作。工厂模式包括工厂方法模式和抽象工厂模式。抽象工厂模式是工厂模式...

网友评论

      本文标题:Chapter4 工厂模式

      本文链接:https://www.haomeiwen.com/subject/lfuklctx.html