我说,别白嫖。
目录
一、 题目
二、 代码
IFood接口:
Bread类:
Milk类:
Factory工厂类:
Main测试类:
三、 实验感悟与难题解决
1、遇到问题及解决方式
2、实验感悟
一、 题目 工厂模式:项目开发中需要考虑实例化对象的解耦和问题,工厂模式隐藏接 口对象实例化操作细节。简单案例如下: 接口定义: interface IFood { // 定义食物标准 public void eat(); // 食物的核心功能:吃 } 类图如下:
请实现 Bread 、 Milk 、 Factory 及测试主类。二、 代码
IFood接口:
public interface IFood {
public void eat();
}
Bread类:
public class Bread implements IFood{
@Override
public void eat() {
System.out.println("吃面包……");
}
}
Milk类:
public class Milk implements IFood{
@Override
public void eat() {
System.out.println("喝牛奶……");
}
}
Factory工厂类:
package factoryMode;
public class Factory {
public static IFood getInstance(String className){
if(className.equals(Bread.class.toString())){
return new Bread();
}else if(className.equals(Milk.class.toString())){
return new Milk();
}else{
System.out.println("该食物未知。");
return new IFood() {
@Override
public void eat() {
System.out.println("吃不明食物……");
}
};
}
}
}
Main测试类:
package factoryMode;
public class Main {
public static void main(String[] args) {
Bread bread = new Bread();
IFood food1 = Factory.getInstance(bread.getClass().toString());
food1.eat(); //吃面包……
Milk milk = new Milk();
IFood food2 = Factory.getInstance(milk.getClass().toString());
food2.eat(); //喝牛奶……
IFood food3 = Factory.getInstance("Coke");
food3.eat(); //该食物未知。吃不明食物……
}
}
public interface IFood {
public void eat();
}
Bread类:
public class Bread implements IFood{
@Override
public void eat() {
System.out.println("吃面包……");
}
}
Milk类:
public class Milk implements IFood{
@Override
public void eat() {
System.out.println("喝牛奶……");
}
}
Factory工厂类:
package factoryMode;
public class Factory {
public static IFood getInstance(String className){
if(className.equals(Bread.class.toString())){
return new Bread();
}else if(className.equals(Milk.class.toString())){
return new Milk();
}else{
System.out.println("该食物未知。");
return new IFood() {
@Override
public void eat() {
System.out.println("吃不明食物……");
}
};
}
}
}
Main测试类:
package factoryMode;
public class Main {
public static void main(String[] args) {
Bread bread = new Bread();
IFood food1 = Factory.getInstance(bread.getClass().toString());
food1.eat(); //吃面包……
Milk milk = new Milk();
IFood food2 = Factory.getInstance(milk.getClass().toString());
food2.eat(); //喝牛奶……
IFood food3 = Factory.getInstance("Coke");
food3.eat(); //该食物未知。吃不明食物……
}
}
public class Milk implements IFood{
@Override
public void eat() {
System.out.println("喝牛奶……");
}
}
Factory工厂类:
package factoryMode;
public class Factory {
public static IFood getInstance(String className){
if(className.equals(Bread.class.toString())){
return new Bread();
}else if(className.equals(Milk.class.toString())){
return new Milk();
}else{
System.out.println("该食物未知。");
return new IFood() {
@Override
public void eat() {
System.out.println("吃不明食物……");
}
};
}
}
}
Main测试类:
package factoryMode;
public class Main {
public static void main(String[] args) {
Bread bread = new Bread();
IFood food1 = Factory.getInstance(bread.getClass().toString());
food1.eat(); //吃面包……
Milk milk = new Milk();
IFood food2 = Factory.getInstance(milk.getClass().toString());
food2.eat(); //喝牛奶……
IFood food3 = Factory.getInstance("Coke");
food3.eat(); //该食物未知。吃不明食物……
}
}
package factoryMode;
public class Main {
public static void main(String[] args) {
Bread bread = new Bread();
IFood food1 = Factory.getInstance(bread.getClass().toString());
food1.eat(); //吃面包……
Milk milk = new Milk();
IFood food2 = Factory.getInstance(milk.getClass().toString());
food2.eat(); //喝牛奶……
IFood food3 = Factory.getInstance("Coke");
food3.eat(); //该食物未知。吃不明食物……
}
}
三、 实验感悟与难题解决
这就别copy了吧。。实验报告内容。。
1、遇到问题及解决方式
首先,在创建Milk和Bread时,思考了Milk和Bread的类型应该是class还是interface。由于Bread和Milk在实现eat方法的时候方法内容不同,所以应该是要覆盖IFood的eat()。所以应该采用class。
其次,在测试类编写非Bread和Milk的IFood对象时,因为无法产生对象,所以要将Factory的getInstance()方法改为static静态的方法,方便调用。
2、实验感悟
首先,在有实现、继承关系的时候,创建对象最好是向上转型。例如,当Bread是IFood的实现类时,创建bread对象最好写成:IFood bread = new Bread(); 这样令bread有拓展空间。
其次,工厂模式类似多态,在工厂生产不同的类似产品的时候,就要使用工厂模式,让每一个产品都有相似但独立的方法。
然后,也要注意错误提示,在创建不符合规格的对象时,也要输出结果或抛出异常。1、



