简单工厂模式 Simple Method Pattern

一、模式介绍

1.1、定义

简单工厂模式不属于23中设计模式,它的缺点是增加新产品时会违背开闭原则。简单工厂一般分为:普通简单工厂、多方法简单工厂、静态方法简单工厂。

简单工厂模式是有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。其创建实例的方法通常为静态方法,因此简单工厂模式(Simple Factory Pattern)又称为静态工厂方法模式(Static Factory Method Pattern)。

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

1.2、优点

  1. 工厂类包含必要的逻辑判断,根据条件创建具体的产品实例。客户端可以通过工厂很方便的创建出相应的产品,省去自己直接创建实例的操作。工厂和产品的职责区分明确
  2. 客户端无需知道所创建具体产品的类名,只需要知道参数即可

1.3、缺点

  1. 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受到影响。且工厂类代码会非常臃肿,违背高聚合原则
  2. 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
  3. 系统扩展困难,一旦增加新产品,不得不修改工厂逻辑;在产品类型较多的情况,可能造成逻辑过于复杂
  4. 简单工厂模式使用静态工厂方法,造成工厂角色无法形成基于继承的等级结构

二、模式的结构与实现

2.1、结构

简单工厂模式的主要角色如下:

  • 简单工厂 SimpleFactory:负责实现创建所有实例的内部逻辑。被客户端可以直接调用工厂中创建产品实例的方法,创建所需的产品对象
  • 抽象产品 Product:是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口
  • 具体产品 ConcreteProduct:是简单工厂模式的创建具体目标对象

其结构如下图所示。
简单工厂模式 Simple Method Pattern_第1张图片

2.2、代码实现

2.2.1、类图

简单工厂模式 Simple Method Pattern_第2张图片

2.2.2、CheesePizza
package com.yj.factory.simple.concrete;

import com.yj.factory.Pizza;

/**
 * 奶酪披萨
 */
public class CheesePizza extends Pizza {
    public CheesePizza() {
        toppings.add("cheese");
    }
}
2.2.3、ClamPizza
package com.yj.factory.simple.concrete;

import com.yj.factory.Pizza;

/**
 * 蛤蜊披萨
 */
public class ClamPizza extends Pizza {

    public ClamPizza() {
        name = "clam pizza";
        toppings.add("clam");
    }
}
2.2.4、PepperoniPizza
package com.yj.factory.simple.concrete;

import com.yj.factory.Pizza;

/**
 * 意大利香肠披萨
 */
public class PepperoniPizza extends Pizza {

    public PepperoniPizza() {
        name = "pepperoni pizza";
        toppings.add("pepperoni");
    }
}
2.2.5、VeggiePizza
package com.yj.factory.simple.concrete;

import com.yj.factory.Pizza;

/**
 * 蔬菜披萨
 */
public class VeggiePizza extends Pizza {

    public VeggiePizza(){
        name = "veggie pizza";
        toppings.add("veggie");
    }
}
2.2.6、SimplePizzaFactory
package com.yj.factory.simple;

import com.yj.factory.Pizza;
import com.yj.factory.simple.concrete.CheesePizza;
import com.yj.factory.simple.concrete.ClamPizza;
import com.yj.factory.simple.concrete.PepperoniPizza;
import com.yj.factory.simple.concrete.VeggiePizza;

/**
 * 只做一件事,帮客户创建Pizza 对象
 */
public class SimplePizzaFactory {

    // ------------------ 普通方法 start ------------------ 
    /**
     * 生成Pizza 实例
     * @param type
     * @return
     */
    public static Pizza createPizza(String type) {
        Pizza pizza = null;
        if (type == null || type.equals("")) {
            return pizza;
        }
        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;
    }
    // ------------------ 普通方法 end ------------------ 
    
    // ------------------ 多个方法 start ------------------ 
    public Pizza createCheese() {
        return new CheesePizza();
    }

    public Pizza createPepperoni() {
        return new PepperoniPizza();
    }
    // ------------------ 多个方法 end ------------------ 
	
	
    // ------------------ 多个静态方法 start ------------------ 
    public static Pizza createClam() {
        return new ClamPizza();
    }

    public static Pizza createVeggie() {
        return new VeggiePizza();
    }
    // ------------------ 多个静态方法 end ------------------ 
}
2.2.7、PizzaStore
package com.yj.factory.simple;

import com.yj.factory.Pizza;


public class PizzaStore {

    public Pizza orderPizza(String type) {
        Pizza pizza;
        pizza = SimplePizzaFactory.createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }

}
2.2.8、PizzaTestDrive
package com.yj.factory.simple.test;

import com.yj.factory.simple.PizzaStore;

public class PizzaTestDrive {

    public static void main(String[] args) {
        PizzaStore pizzaStore = new PizzaStore();
        pizzaStore.orderPizza("cheese");
        System.out.println("-------------------------");
        pizzaStore.orderPizza("clam");
        System.out.println("-------------------------");
        pizzaStore.orderPizza("pepperoni");
        System.out.println("-------------------------");
        pizzaStore.orderPizza("veggie");
    }
}

2.2.9、运行结果
Preparing cheese pizza
Tossing dough ...
Adding sauce ...
Adding toppings: 
 cheese
350度烘烤25分钟
把披萨切成对角
把披萨放在官方的披萨盒里
-------------------------
Preparing clam pizza
Tossing dough ...
Adding sauce ...
Adding toppings: 
 clam
350度烘烤25分钟
把披萨切成对角
把披萨放在官方的披萨盒里
-------------------------
Preparing pepperoni pizza
Tossing dough ...
Adding sauce ...
Adding toppings: 
 pepperoni
350度烘烤25分钟
把披萨切成对角
把披萨放在官方的披萨盒里
-------------------------
Preparing veggie pizza
Tossing dough ...
Adding sauce ...
Adding toppings: 
 veggie
350度烘烤25分钟
把披萨切成对角
把披萨放在官方的披萨盒里

你可能感兴趣的:(设计模式,创建型模式,简单工厂模式,工厂模式,设计模式)