设计模式 — 简单工厂模式(Simple Factory)

定义:定义一个工厂类,它可以根据参数的不同返回不同类型的实例,被创建的实例通常有公共的父类。

模式类型:创建型模型

Factory(工厂角色):即工厂类,负责实现创建所有产品实例的内部逻辑;工厂类可以直接被外界调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法FactoryMethod(),它的返回类型为抽象产品Product

Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公共方法。提高了系统的灵活性,使得工厂类只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。

ConcreteProduct(具体产品角色):所有被创建的对象都充当某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。

 

案例:pizza生产简单工厂模式

 

  1 /**
  2  * @author EASON
  3  * @date 2017.1.7  13:23
  4  * @function 工厂模式
  5  */
  6 package com.nju;
  7 
  8 import java.io.BufferedReader;
  9 import java.io.IOException;
 10 import java.io.InputStreamReader;
 11 
 12 public class Test {
 13     public static void main(String[] args) {
 14         PizzaStore ps = new PizzaStore();
 15         ps.orderPizza();
 16     }
 17 }
 18 
 19 //抽象产品类
 20 interface Pizza{
 21     public void prepare();
 22     public void bake();
 23     public void cut();
 24     public void packaged();
 25 }
 26 
 27 //具体产品类-奶酪披萨
 28 class CheesePizza implements Pizza{
 29     //具体产品类需要实现抽象产品类中的方法
 30     public void prepare() {
 31         System.out.println("奶酪披萨开始制作...");
 32     }
 33 
 34     public void bake() {
 35         System.out.println("奶酪披萨开始烘焙...");
 36     }
 37 
 38     public void cut() {
 39         System.out.println("奶酪披萨开始切块...");
 40     }
 41 
 42     public void packaged() {
 43         System.out.println("奶酪披萨包装完毕...");
 44     }
 45     
 46 }
 47 
 48 //具体产品类-洋葱披萨
 49 class PepperoniPizza implements Pizza{
 50 
 51     public void prepare() {
 52         System.out.println("洋葱披萨开始制作...");
 53     }
 54 
 55     public void bake() {
 56         System.out.println("洋葱披萨开始烘焙...");
 57     }
 58 
 59     public void cut() {
 60         System.out.println("洋葱披萨开始切块...");
 61     }
 62 
 63     public void packaged() {
 64         System.out.println("洋葱披萨包装完毕...");
 65     }
 66     
 67 }
 68 
 69 //Pizza工厂类
 70 class PizzaFactory{
 71     public Pizza getPizza(String pizzaType){
 72         switch(pizzaType){
 73         case("cheesePizza"):
 74             return new CheesePizza();
 75         case("pepperonPizza"):
 76             return new PepperoniPizza();
 77         default:
 78             return null;
 79         }
 80     }
 81 }
 82 
 83 //Pizza商店类
 84 class PizzaStore{
 85     public void orderPizza(){
 86         BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
 87         PizzaFactory pf = new PizzaFactory();
 88         System.out.println("欢迎光临!");
 89         System.out.println("请输入你想要购买的Pizza:");
 90         try {
 91             String pizzaType = bf.readLine();
 92             Pizza pizza = pf.getPizza(pizzaType);
 93             pizza.prepare();
 94             pizza.bake();
 95             pizza.cut();
 96             pizza.packaged();
 97             System.out.println("欢迎下次光临!");
 98         } catch (IOException e) {
 99             e.printStackTrace();
100         }
101     }
102 }

 使用简单工厂模式的好处,可以把复杂的逻辑判断代码从PizzaStore中分离出来,即便需要修改判断逻辑,也不会影响PizzaStore,符合OCP。

 

posted @ 2017-01-07 15:06  一只敲码的猫  阅读(551)  评论(0编辑  收藏  举报