夜光序言:
昨天的自己已经无法适应今天的故事只有改变才是唯一不变的。
正文:
以道御术 / 以术识道
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;
}
}