zoukankan      html  css  js  c++  java
  • 创建型模式——工厂方法模式

    紧着着简单工程模式,本篇介绍工厂方法模式。

    1.需求

    看一个新的需求 披萨项目新的需求: 客户在点披萨时, 可以点不同口味的披萨, 比如 北京的奶酪 pizza、 北京的胡椒 pizza 或 者是伦敦的奶酪 pizza、 伦敦的胡椒 pizza。

    思路 1:

    使用简单工厂模式, 创建不同的简单工厂类, 比如 BJPizzaSimpleFactory、 LDPizzaSimpleFactory 等等.从当前 这个案例来说, 也是可以的, 但是考虑到项目的规模, 以及软件的可维护性、 可扩展性并不是特别好

    思路 2:

    使用工厂方法模式

    1.1工厂方法模式介绍

    1) 工厂方法模式设计方案: 将披萨项目的实例化功能抽象成抽象方法, 在不同的口味点餐子类中具体实现。

    2) 工厂方法模式: 定义了一个创建对象的抽象方法, 由子类决定要实例化的类。 工厂方法模式将对象的实例 化推迟到子类。

    1.2.工厂方法模式应用案例

    1.2.1.披萨项目新的需求

    客户在点披萨时, 可以点不同口味的披萨, 比如 北京的奶酪 pizza、 北京的胡椒 pizza 或 者是伦敦的奶酪 pizza、 伦敦的胡椒 pizza

    1.2.2.思路分析

    1.2.3.代码

     

    1.Pizza

    package com.atguigu.factory.factorymethod.pizzastore.pizza;
    
    //将Pizza 类做成抽象
    public abstract class Pizza {
    	protected String name; //名字
    
    	//准备原材料, 不同的披萨不一样,因此,我们做成抽象方法
    	public abstract void prepare();
    
    	
    	public void bake() {
    		System.out.println(name + " baking;");
    	}
    
    	public void cut() {
    		System.out.println(name + " cutting;");
    	}
    
    	//打包
    	public void box() {
    		System.out.println(name + " boxing;");
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    

      2.LDPepperPizza

    package com.atguigu.factory.factorymethod.pizzastore.pizza;
    
    public class LDPepperPizza extends Pizza{
    	@Override
    	public void prepare() {
    		// TODO Auto-generated method stub
    		setName("伦敦的胡椒pizza");
    		System.out.println(" 伦敦的胡椒pizza 准备原材料");
    	}
    }
    

      3.LDCheesePizza

    package com.atguigu.factory.factorymethod.pizzastore.pizza;
    
    public class LDCheesePizza extends Pizza{
    
    	@Override
    	public void prepare() {
    		// TODO Auto-generated method stub
    		setName("伦敦的奶酪pizza");
    		System.out.println(" 伦敦的奶酪pizza 准备原材料");
    	}
    }
    

      4.BJPepperPizza

    package com.atguigu.factory.factorymethod.pizzastore.pizza;
    
    public class BJPepperPizza extends Pizza {
    	@Override
    	public void prepare() {
    		// TODO Auto-generated method stub
    		setName("北京的胡椒pizza");
    		System.out.println(" 北京的胡椒pizza 准备原材料");
    	}
    }
    

      5.BJPepperPizza

    package com.atguigu.factory.factorymethod.pizzastore.pizza;
    
    public class BJPepperPizza extends Pizza {
    	@Override
    	public void prepare() {
    		// TODO Auto-generated method stub
    		setName("北京的胡椒pizza");
    		System.out.println(" 北京的胡椒pizza 准备原材料");
    	}
    }
    

      6.BJOrderPizza

    package com.atguigu.factory.factorymethod.pizzastore.order;
    
    import com.atguigu.factory.factorymethod.pizzastore.pizza.BJCheesePizza;
    import com.atguigu.factory.factorymethod.pizzastore.pizza.BJPepperPizza;
    import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
    
    
    public class BJOrderPizza extends OrderPizza {
    
    	
    	@Override
    	Pizza createPizza(String orderType) {
    	
    		Pizza pizza = null;
    		if(orderType.equals("cheese")) {
    			pizza = new BJCheesePizza();
    		} else if (orderType.equals("pepper")) {
    			pizza = new BJPepperPizza();
    		}
    		// TODO Auto-generated method stub
    		return pizza;
    	}
    
    }
    

      7.LDOrderPizza

    package com.atguigu.factory.factorymethod.pizzastore.order;
    
    import com.atguigu.factory.factorymethod.pizzastore.pizza.BJCheesePizza;
    import com.atguigu.factory.factorymethod.pizzastore.pizza.BJPepperPizza;
    import com.atguigu.factory.factorymethod.pizzastore.pizza.LDCheesePizza;
    import com.atguigu.factory.factorymethod.pizzastore.pizza.LDPepperPizza;
    import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
    
    
    public class LDOrderPizza extends OrderPizza {
    
    	
    	@Override
    	Pizza createPizza(String orderType) {
    	
    		Pizza pizza = null;
    		if(orderType.equals("cheese")) {
    			pizza = new LDCheesePizza();
    		} else if (orderType.equals("pepper")) {
    			pizza = new LDPepperPizza();
    		}
    		// TODO Auto-generated method stub
    		return pizza;
    	}
    
    }
    

      8.OrderPizza 

    package com.atguigu.factory.factorymethod.pizzastore.order;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
    
    public abstract class OrderPizza {
    
    	//定义一个抽象方法,createPizza , 让各个工厂子类自己实现
    	abstract Pizza createPizza(String orderType);
    	
    	// 构造器
    	public OrderPizza() {
    		Pizza pizza = null;
    		String orderType; // 订购披萨的类型
    		do {
    			orderType = getType();
    			pizza = createPizza(orderType); //抽象方法,由工厂子类完成
    			//输出pizza 制作过程
    			pizza.prepare();
    			pizza.bake();
    			pizza.cut();
    			pizza.box();
    			
    		} while (true);
    	}
    
    	// 写一个方法,可以获取客户希望订购的披萨种类
    	private String getType() {
    		try {
    			BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
    			System.out.println("input pizza 种类:");
    			String str = strin.readLine();
    			return str;
    		} catch (IOException e) {
    			e.printStackTrace();
    			return "";
    		}
    	}
    
    }
    

      9.PizzaStore

    package com.atguigu.factory.factorymethod.pizzastore.order;
    
    import java.util.Scanner;
    
    public class PizzaStore {
    
    	public static void main(String[] args) {
    		System.out.println("请输入地点");
    		Scanner sc = new Scanner(System.in);
    		String loc = sc.next();
    		if (loc.equals("bj")) {
    			//创建北京口味的各种Pizza
    			new BJOrderPizza();
    		} else {
    			//创建伦敦口味的各种Pizza
    			new LDOrderPizza();
    		}
    		// TODO Auto-generated method stub
    	}
    
    }
    

      结果:

    Connected to the target VM, address: '127.0.0.1:51537', transport: 'socket'
    请输入地点
    bj
    input pizza 种类:
    cheese
     北京的奶酪pizza 准备原材料
    北京的奶酪pizza baking;
    北京的奶酪pizza cutting;
    北京的奶酪pizza boxing;
    input pizza 种类:
    

      

  • 相关阅读:
    【泛型方法】
    【为什么使用泛型?】
    【泛型类】
    【泛型:ArrayListDemo】
    【泛型概述】
    【Collections:集合工具类:扑克游戏】
    【Collections:集合工具类:自然排序和比较器排序】
    Navicat for MYSQL 断网时本地连接无法打开,2005错误
    Navicat for MYSQL 数据库手动同步方法
    spring redis @Cacheable注解使用部分错误及无效原因
  • 原文地址:https://www.cnblogs.com/aaaazzzz/p/14198096.html
Copyright © 2011-2022 走看看