版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/84677374
创建型模式综合练习
一、作业内容
利用设计模式模拟电视机样品生产过程。海尔工厂负责生产海尔样机,海信工厂负责生产海信样机,如果需要生产TCL或创维样机,只需要对应增加新的TCL工厂或创维工厂即可。设计需要满足如下要求:
1.生产的电视机对象具有自我复制能力(浅拷贝)
2.由于是样品机,因此每种品牌电视机仅允许生产一台,且仅允许该电视 机自我复制一次。
3.使用工厂方法模式、单例模式和原型模式综合起来设计。
二、UML类图
三、开发环境
Windows10、Java8、Eclipse
四、工程文件架构
五、源代码
1.factory包
TVFactory.java
package factory;
import TV.TV;
public interface TVFactory {
public TV produceTV();
}
HaierTVFactory.java
package factory;
import TV.HaierTV;
import TV.TV;
public class HaierTVFactory implements TVFactory{
@Override
public TV produceTV() {
return HaierTV.getHaierTVInstance();
}
}
HisenseTVFfactory.java
package factory;
import TV.HisenseTV;
import TV.TV;
public class HisenseTVFfactory implements TVFactory{
@Override
public TV produceTV() {
return HisenseTV.getHisenseTVInstance();
}
}
2.TV包
TV.java
package TV;
public interface TV {
public void play();
public TV clone();
}
HaierTV.java
package TV;
public class HaierTV implements TV, Cloneable{
private int COPY_MAX = 1;
private static HaierTV instance = null;
@Override
public void play() {
System.out.println("海尔电视机播放。。。");
}
@Override
public TV clone() {
if(COPY_MAX == 1) {
HaierTV clone = null;
try {
clone = (HaierTV) super.clone();
COPY_MAX = 0;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}else {
try {
throw new Exception("只能复制一次,您已经复制过了,不可再次复制!");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
private HaierTV() {
}
public static HaierTV getHaierTVInstance() {
if(instance == null) {
instance = new HaierTV();
return instance;
}else {
return instance;
}
}
}
HisenseTV.java
package TV;
public class HisenseTV implements TV, Cloneable{
private int COPY_MAX = 1;
private static HisenseTV instance = null;
@Override
public void play() {
System.out.println("海信电视机播放。。。");
}
@Override
public TV clone() {
if(COPY_MAX == 1) {
HisenseTV clone = null;
try {
clone = (HisenseTV) super.clone();
COPY_MAX = 0;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}else {
try {
throw new Exception("只能复制一次,您已经复制过了,不可再次复制!");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
private HisenseTV() {
}
public static HisenseTV getHisenseTVInstance() {
if(instance == null) {
instance = new HisenseTV();
return instance;
}else {
return instance;
}
}
}
3.util包
XMLUtil.java
package util;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLUtil {
public static Object getBean() {
try {
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc = (Document) builder.parse(new File("config.xml"));
NodeList nList = doc.getElementsByTagName("className");
Node classNode = (Node) nList.item(0).getFirstChild();
String className = classNode.getNodeValue();
Class c = Class.forName(className);
Object object = c.newInstance();
return object;
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
4.config.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<className>factory.HaierTVFactory</className>
</config>
5.test包
Client.java
package test;
import TV.HisenseTV;
import TV.TV;
import factory.TVFactory;
import util.XMLUtil;
//客户端,全部是面向抽象编程
public class Client {
public static void main(String[] args) {
try {
TV tv;
TVFactory factory;
factory = (TVFactory)XMLUtil.getBean();
tv = factory.produceTV();
tv.play();
TV tv2 = tv.clone();
TV tv3 = factory.produceTV();
tv2.play();//浅拷贝,和tv运行结果一样
tv3.play();
System.out.println("tv==tv3?"+(tv==tv3));//证明是单例模式,返回true
//证明只能复制一次
//TV tv4 = tv.clone();//抛出异常:只能复制一次,您已经复制过了,不可再次复制!
}catch(Exception e) {
e.printStackTrace();
}
}
}