有句话说得好,项目经理给你留下一项任务,如果你使用了工厂模式,那么,恭喜你,可以按时下班,如果使用了new对象,哈哈~准备加班到深夜吧。。。
下面使用一个例子说一下。编写程序实现披萨的制作,可供选择的披萨有:培根披萨和海鲜披萨。实现思路及关键代码
1)分析培根披萨和海鲜披萨
2)属性:名称、价格、大小
3)方法:展示!
运行结果
//父类披萨
package homework4;
public class Pizza {
private String name;//披萨名字
private int price;//价格
private int size;//尺寸
public Pizza(String name, int price, int size) {
super();
this.name = name;
this.price = price;
this.size = size;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public void show(){
System.out.println("名称:"+name);
System.out.println("价格:"+price+"元");
System.out.println("大小:"+size+"寸");
}
}
//培根披萨
package homework4;
import java.util.Scanner;
public class Bacon extends Pizza {
private int num;
public Bacon(int num) {
super();
this.num = num;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public void show() {
super.show();
System.out.println("培根克数"+num);
}
}
//海鲜披萨
package homework4;
public class SeaFood extends Pizza {
private String dosing;
public SeaFood(String dosing) {
super();
this.dosing = dosing;//配料信息
}
public String getDosing() {
return dosing;
}
public void setDosing(String dosing) {
this.dosing = dosing;
}
@Override
public void show() {
super.show();
System.out.println("配料:"+dosing);
}
}
//披萨的工厂
package homework4;
import java.util.Scanner;
public class PizzaFactory {
public static Pizza getpizza(int name){//定义为static类型,便于在测试中调用
Pizza p = null;//初始p
Scanner sc = new Scanner(System.in);
if(name == 1){//如果name==1,则输出培根披萨的信息
p = new Bacon();//new一个对象赋值给pizza
p.setName("培根披萨");//定义其名字
System.out.println("请输入培根克数:");
Bacon b = (Bacon)p;//强转成Bacon类型,便于使用.setNum
b.setNum(sc.nextInt());
}else if(name == 2){//name==2 输出海鲜披萨的信息
p = new SeaFood();
p.setName("海鲜披萨");
System.out.println("请输入配料信息:");
SeaFood s = (SeaFood)p;//将p强转成海鲜类 的类型
s.setDosing(sc.next());
}
System.out.print("请输入披萨大小:");//在if之外,故强转完之后的p属于不同的类型,所以输出各自子类的信息(个人理解)
p.setSize(sc.nextInt());
System.out.print("请输入披萨价格:");
p.setPrice(sc.nextInt());
return p;//因为不是void型,所以需要返回一个值
}
}
//测试类,很简洁,正是工厂的优点
package homework4;
import java.util.Scanner;
public class PizzaTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请选择想要制作的披萨:(1.培根披萨 2.海鲜披萨)");
Pizza pizza = PizzaFactory.getpizza(sc.nextInt());
pizza.show();
}
}
个人理解的的工厂模式,就是将大部分信息都放在工厂类之后,一方面是简化了测试类的操作,不需要多次new对象;另一方面是即使再次添加其他的披萨子类,也能够直接在工厂类中操作,不需要改动大量的代码,简化工程。还有一个为买饮料的例子,请参看作业8。