zoukankan      html  css  js  c++  java
  • 第二节:简单工厂模式(静态工厂模式)

    一、简单工厂模式

      1、基本介绍

        (1)简单工厂模式是属于创建型模式,是工厂模式的一种。

        (2)简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例简单工厂模式是工厂模式家族中最简单实用的模式。

        (3)简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。

        (4)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。

      2、思路分析

        针对于上一节的披萨订购项目,我们可以使用 简单工厂模式,定义一个可以实例化 Pizza 对象的类,封装创建对象的代码。

        然后项目中只要有需要获取 Pizza 实例的地方,都可以使用该类获取 Pizza 实例。

        UML 类图:

        

      3、代码实现

        简单工厂类:

     1 /**
     2  * 简单工厂类
     3  */
     4 public class SimpleFactory {
     5 
     6     //根据 orderType 返回对应的 Pizza 对象
     7     public Pizza createPizza(String orderType) {
     8         Pizza pizza = null;
     9 
    10         System.out.println("使用简单工厂模式~");
    11 
    12         if (orderType.equals("greek")) {
    13             pizza = new GreekPizza();
    14             pizza.setName("希腊披萨");
    15         } else if (orderType.equals("cheese")) {
    16             pizza = new CheesePizza();
    17             pizza.setName("奶酪披萨");
    18         } else if (orderType.equals("pepper")) {
    19             pizza = new PepperPizza();
    20             pizza.setName("胡椒披萨");
    21         }
    22         return pizza;
    23     }
    24 }

     

      使用简单工厂生成实例:

     1 public class OrderPizza2 {
     2 
     3     //使用聚合方式,定义一个简单工厂对象
     4     SimpleFactory simpleFactory;
     5     Pizza pizza = null;
     6 
     7     //构造器
     8     public OrderPizza2(SimpleFactory simpleFactory) {
     9         setSimpleFactory(simpleFactory);
    10     }
    11 
    12 
    13     public void setSimpleFactory(SimpleFactory simpleFactory) {
    14         //用户输入的披萨类型
    15         String orderType = "";
    16 
    17         this.simpleFactory = simpleFactory;
    18 
    19         do {
    20             orderType = getType();
    21             pizza = this.simpleFactory.createPizza(orderType);
    22 
    23             //输出 pizza
    24             if (pizza != null) {
    25                 pizza.prepare();
    26                 pizza.bake();
    27                 pizza.cut();
    28                 pizza.box();
    29             } else {
    30                 System.out.println("订购披萨失败,该种披萨还为上架!");
    31                 break;
    32             }
    33         } while (true);
    34     }
    35 
    36     //声明一个方法,可以获取客户希望订购的披萨种类
    37     private String getType() {
    38         try {
    39             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    40             System.out.println("input pizza 种类:");
    41             String str = bufferedReader.readLine();
    42             return str;
    43         } catch (IOException e) {
    44             e.printStackTrace();
    45             return "";
    46         }
    47     }
    48 }

      测试:

     1 /**
     2  * 相当于一个客户端,发出订购
     3  */
     4 public class PizzaStore {
     5 
     6     public static void main(String[] args) {
     7 
     8         //使用简单工厂方式
     9         new OrderPizza2(new SimpleFactory());
    10 
    11     }
    12 }

      如果需要扩展对应的 Pizza 类,定义一个新的 Pizza的子类,然后在工厂类中根据不同的类型进行实例化,而其他的地方不需要改动。

    二、静态工厂模式

      简单工厂模式 也被称为 静态工厂模式。

      静态工厂模式:

     1 public class SimpleFactory {
     2 
     3     //简单工厂模式 也被称为  静态工厂模式
     4     public static Pizza makePizza(String orderType) {
     5         Pizza pizza = null;
     6 
     7         System.out.println("使用静态工厂模式~");
     8 
     9         if (orderType.equals("greek")) {
    10             pizza = new GreekPizza();
    11             pizza.setName("希腊披萨");
    12         } else if (orderType.equals("cheese")) {
    13             pizza = new CheesePizza();
    14             pizza.setName("奶酪披萨");
    15         } else if (orderType.equals("pepper")) {
    16             pizza = new PepperPizza();
    17             pizza.setName("胡椒披萨");
    18         }
    19         return pizza;
    20     }
    21 
    22 }

      使用静态工厂模式:

     1 public class OrderPizza3 {
     2 
     3     Pizza pizza = null;
     4 
     5     //构造器
     6     public OrderPizza3() {
     7         //用户输入的披萨类型
     8         String orderType = "";
     9 
    10         do {
    11             orderType = getType();
    12             pizza = SimpleFactory.makePizza(orderType);
    13 
    14             //输出 pizza
    15             if (pizza != null) {
    16                 pizza.prepare();
    17                 pizza.bake();
    18                 pizza.cut();
    19                 pizza.box();
    20             } else {
    21                 System.out.println("订购披萨失败,该种披萨还为上架!");
    22                 break;
    23             }
    24         } while (true);
    25     }
    26 
    27 
    28 
    29 
    30     //声明一个方法,可以获取客户希望订购的披萨种类
    31     private String getType() {
    32         try {
    33             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    34             System.out.println("input pizza 种类:");
    35             String str = bufferedReader.readLine();
    36             return str;
    37         } catch (IOException e) {
    38             e.printStackTrace();
    39             return "";
    40         }
    41     }
    42 }

      测试代码:

     1 /**
     2  * 相当于一个客户端,发出订购
     3  */
     4 public class PizzaStore {
     5 
     6     public static void main(String[] args) {
     7         //不使用设计模式
     8         //new OrderPizza();
     9 
    10         //使用简单工厂方式
    11         //new OrderPizza2(new SimpleFactory());
    12 
    13         //使用静态工厂模式
    14         new OrderPizza3();
    15     }
    16 }
  • 相关阅读:
    配置虚拟主机并更改Apache默认解析路径
    在ListView中实现排序
    petshop4.0 具体解释之中的一个(系统架构设计)
    学习笔记之TCP/IP协议分层与OSI參考模型
    cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
    cmake 学习笔记(一)
    标准差(standard deviation)和标准误差(standard error)你能解释清楚吗?
    Web.xml配置具体解释之context-param
    福克斯:悲观?乐观?就看你与世界怎么互动
    Android 服务类Service 的具体学习
  • 原文地址:https://www.cnblogs.com/niujifei/p/14225681.html
Copyright © 2011-2022 走看看