模拟电视机样品生产过程(工厂+单例+原型)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
		}
	}
}

六、实验结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/84677374
今日推荐