zoukankan      html  css  js  c++  java
  • 设计模式 — 简单工厂模式(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。

     

  • 相关阅读:
    out/host/linuxx86/obj/EXECUTABLES/aapt_intermediates/aapt 64 32 操作系统
    linux 查看路由器 电脑主机 端口号 占用
    linux proc进程 pid stat statm status id 目录 解析 内存使用
    linux vim 设置大全详解
    ubuntu subclipse svn no libsvnjavahl1 in java.library.path no svnjavahl1 in java.library.path no s
    win7 安装 ubuntu 双系统 详解 easybcd 工具 不能进入 ubuntu 界面
    Atitit.json xml 序列化循环引用解决方案json
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.跨语言  文件夹与文件的io操作集合  草案
    Atitit.atijson 类库的新特性设计与实现 v3 q31
  • 原文地址:https://www.cnblogs.com/huiAlex/p/6259446.html
Copyright © 2011-2022 走看看