夜光带你走进 Java 成神之路(九)擅长的领域

 

夜光序言:

 

 

昨天的自己已经无法适应今天的故事只有改变才是唯一不变的。

 

 

 

 

 

 

 

 

 

正文:

                           以道御术 / 以术识道

 

 

 

 

 

package 工厂设计模式;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

//会使用到其他几个类
public class OrderPizza {

        //构造器
    public OrderPizza(){
        Pizza pizza = null;  //第一步
        String orderType;  //订购披萨的类型
        //写一个 do while 循环
        do {
            /*orderType = "Greek";*/
            orderType = gettype(); //这里就不写死了
            if (orderType.equals("greek")){
                pizza = new GreekPizza(); //如果判断是这样的话,那么我们就创建一个实例
            }else if (orderType.equals("cheese")){
                pizza = new CheesePizza();
            }else{
                break;
            }
        }while (true);
    }

    //写一个方法,可以获取客户希望订购的披萨类型
    private String gettype(){
        try{
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));

            System.out.println("请输入披萨类型:");
            String str = strin.readLine();
            return str;

        }catch (IOException e){

            e.printStackTrace();
            return "";
        }
    }
}

 

 

 

 

 

package 工厂设计模式;

public class PizzaStore {
    public static void main(String[] args) {
        new OrderPizza(); //new 一个对象出来运行一下
    }
}

 

package 工厂设计模式.案例1;

//夜光:将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 String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

 

package 工厂设计模式.案例1;

public class CheesePizza extends Pizza{

    //重写一下这个父类的方法
    @Override
    public void prepare() {
        System.out.println("制作奶酪披萨,准备原材料~");
    }
}
package 工厂设计模式.案例1;

public class GreekPizza extends Pizza{
    //重写一下父类的方法
    @Override
    public void prepare() {
        System.out.println("给希腊披萨,准备原材料~");
    }
}

 

 

package 工厂设计模式.案例1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

//会使用到其他几个类
public class OrderPizza {

        //构造器
    public OrderPizza(){
        Pizza pizza = null;  //第一步
        String orderType;  //订购披萨的类型
        //写一个 do while 循环
        do {
            /*orderType = "Greek";*/
            orderType = gettype(); //这里就不写死了
            if (orderType.equals("greek")){
                pizza = new GreekPizza(); //如果判断是这样的话,那么我们就创建一个实例
                pizza.setName(" 希腊披萨 ");
            }else if (orderType.equals("cheese")){
                pizza = new CheesePizza();
                pizza.setName(" 奶酪披萨 ");
            }else{
                break;
            }
            //输出披萨制作的过程
            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("请输入披萨类型:");
            String str = strin.readLine();
            return str;

        }catch (IOException e){

            e.printStackTrace();
            return "";
        }
    }
}

 

package 工厂设计模式.案例1;

public class PizzaStore {
    public static void main(String[] args) {
        new OrderPizza(); //new 一个对象出来运行一下
    }
}

如果新加入一个披萨,则需要修改的地方有点多

 

 

 

 

 

 

package 工厂设计模式.案例1改进;

//夜光:改进之处,就是可以创建一个简单工厂
//包含三种类型的披萨
public class SimpleFactory {

    public Pizza createPizza(String orderType){ //传入一个string类型的orderType
        Pizza pizza = null;
        System.out.println("使用简单工厂模式");
        if (orderType.equals("greek")){
            pizza = new GreekPizza(); //如果判断是这样的话,那么我们就创建一个实例
            pizza.setName(" 希腊披萨 ");
        }else if (orderType.equals("cheese")){
            pizza = new CheesePizza();
            pizza.setName(" 奶酪披萨 ");
        }else if(orderType.equals("pepper")){  //每次新增一个披萨都需要添加一个分支,有点麻烦
            pizza = new PepperPizza();
            pizza.setName(" 椒盐披萨 ");
        }
        return pizza;
    }
}

 

 

 

 

 

package 工厂设计模式.案例1改进;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

//会使用到其他几个类
public class OrderPizza {

        //构造器
    //下面这种方式不好
    //我们先不用
    /*public OrderPizza(){
        Pizza pizza = null;  //第一步
        String orderType;  //订购披萨的类型
        //写一个 do while 循环
        do {
            *//*orderType = "Greek";*//*
            orderType = gettype(); //这里就不写死了
            if (orderType.equals("greek")){
                pizza = new GreekPizza(); //如果判断是这样的话,那么我们就创建一个实例
                pizza.setName(" 希腊披萨 ");
            }else if (orderType.equals("cheese")){
                pizza = new CheesePizza();
                pizza.setName(" 奶酪披萨 ");
            }else if(orderType.equals("pepper")){  //每次新增一个披萨都需要添加一个分支,有点麻烦
                pizza = new PepperPizza();
                pizza.setName(" 椒盐披萨 ");
            }else{
                break;
            }
            //输出披萨制作的过程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();

        }while (true);
    }*/

    //先采用下面这种聚合simplefactory的方式
    //1. 先定义一个简单工厂对象
    SimpleFactory simpleFactory; //初始值,我设置为空

    Pizza pizza = null; //先为空

    //夜光:构造器还是需要的
    public OrderPizza(SimpleFactory simpleFactory){
        setFactory(simpleFactory);  //因为我现在用的是聚合关系,所以simpleFactory是从外部传进来的,如果思路是new 组合关系的话也是可以的
    }


    //2. 下面我们设置工厂
    public void setFactory(SimpleFactory simpleFactory){
           String orderType = ""; //这个由用户输入

           this.simpleFactory = simpleFactory; //设置一个简单的工厂对象

           do{

               orderType = gettype();  //这个方法

               pizza = this.simpleFactory.createPizza(orderType);

               //输出披萨
               if (pizza != null){  //如果不为空,则说明是有的,存在这么一个pizza
                      pizza.prepare();
                      pizza.bake();
                      pizza.cut();
                      pizza.box();
               }else {
                   System.out.println("订购披萨失败");
                   break;
               }
           }while(true);
    }



    //写一个方法,可以获取客户希望订购的披萨类型
    private String gettype(){
        try{
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));

            System.out.println("请输入披萨类型:");
            String str = strin.readLine();
            return str;

        }catch (IOException e){

            e.printStackTrace();
            return "";
        }
    }
}

 

 

package 工厂设计模式.案例1改进;

public class PizzaStore {
    public static void main(String[] args) {
        /*new OrderPizza(); //new 一个对象出来运行一下*/

        //我们改进写的工厂类,如何调用,思考一下
        new OrderPizza(new SimpleFactory());
        System.out.println("退出了程序~");
    }
}

 

package 工厂设计模式.案例1改进;

//夜光:改进之处,就是可以创建一个简单工厂
//包含三种类型的披萨
//要给OrderPizza这个类去使用,那么如何聚合呢
public class SimpleFactory {

    public Pizza createPizza(String orderType){ //传入一个string类型的orderType
        Pizza pizza = null;
        System.out.println("使用简单工厂模式");
        if (orderType.equals("greek")){
            pizza = new GreekPizza(); //如果判断是这样的话,那么我们就创建一个实例
            pizza.setName(" 希腊披萨 ");
        }else if (orderType.equals("cheese")){
            pizza = new CheesePizza();
            pizza.setName(" 奶酪披萨 ");
        }else if(orderType.equals("pepper")){  //每次新增一个披萨都需要添加一个分支,有点麻烦
            pizza = new PepperPizza();
            pizza.setName(" 椒盐披萨 ");
        }
        return pizza;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值