一、 实验目的与要求
1.练习使用工厂模式。设计相关的模拟场景并进行实施,验证模式特性,掌握其优缺点。
2.实验结束后,对相关内容进行总结。
二、实验内容
1.模式应用场景说明
手机CPU生产工厂:在一个工厂里面,有Apple和Huawei两种生产线。Huawei可以生产Huawei电脑和Huawei手机,APPLE可以生产APPLE电脑和APPLE手机。解决这个问题,可以抽象一个电器生产厂。下面有两个具体的工程,一个叫Huawei工厂,一个叫APPLE工厂。有两条生产线,一条生产线可以生产APPLE电脑和Huawei电脑,另一条生产线可以生产APPLE手机和Huawei手机。
2.应用场景类图
3.实现代码与解释
3.1抽象产品类Phone
package 抽象工厂模式;
public interface Phone {public void play();
}
3.2具体产品类ApplePhone
package 抽象工厂模式;
public class ApplePhone implements Phone {public void play() {System.out.println("Apple手机使用中...");}
}
3.3具体产品类 HuaweiPhone
package 抽象工厂模式;
public class HuaweiPhone implements Phone {public void play() {System.out.println("Huawei手机使用中...");}
}
3.4抽象产品类Computer
package 抽象工厂模式;
public interface Computer {public void useComputer();
}
3.5具体产品类AppleComputer
package 抽象工厂模式;
public class AppleComputer implements Computer{public void useComputer() {System.out.println("Apple电脑使用中...");}
}
3.6具体产品类 HuaweiComputer
package 抽象工厂模式;
public class HuaweiComputer implements Computer{public void useComputer() {System.out.println("Huawei电脑使用中...");}
}
3.7 抽象工厂类EFactory
package 抽象工厂模式;
public interface EFactory {public Phone producePhone();public Computer produceComputer();
}
3.8具体工厂类HuaweiFactory
package 抽象工厂模式;
public class HuaweiFactory implements EFactory{public Phone producePhone() {return new HuaweiPhone();}public Computer produceComputer() {return new HuaweiComputer();}
}
3.9具体工厂类AppleFactory
package 抽象工厂模式;
public class AppleFactory implements EFactory{public Phone producePhone() {return new ApplePhone();}public Computer produceComputer() {return new AppleComputer();}
}
3.7辅助代码:获取外界配置文件的信息
package 抽象工厂模式;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getBean(){try{//创建文档对象DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc; doc = builder.parse(new File("F:\\创建型模式\\抽象工厂模式\\抽象工厂模式\\src\\抽象工厂模式\\config.xml")); //获取包含类名的文本节点NodeList nl = doc.getElementsByTagName("className");Node classNode=nl.item(0).getFirstChild();String cName=classNode.getNodeValue();//通过类名生成实例对象并将其返回Class c=Class.forName("抽象工厂模式."+cName);Object obj=c.newInstance();return obj;} catch(Exception e){e.printStackTrace();return null;}}
}
3.8外界配置文件
4.结果及分析
4.1将配置文件节点改成AppleFactory
4.2将配置文件节点改成HuaweiFactory
三、实验总结
优点:隔离了具体类的生成,可以是实现高内聚低耦合的设计目的。
缺点:涉及对抽象工厂的角色及其对所有子类的修改,显然带来较大的不便。