实验内容
一、 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数“M”,则返回一个Man对象,如果传入参数“W”,则返回一个Woman对象。现需要增加一个新的Robot类,如果传入参数“R”,则返回一个Robot对象,对代码进行修改并注意“女娲”的变化。绘制类图并编程模拟实现。
需提供简单工厂模式实例的结构图(类图)和模拟实现代码。
添加Robot类之前类图:
1.Person接口:
public interface Person {
public void create();
}
2.Man类
public class Man implements Person{
@Override
public void create() {
System.out.println("制造男人!");
}
}
3.Woman类
public class Woman implements Person{
@Override
public void create() {
System.out.println("制造女人!");
}
}
4.NvwaFactory类
public class NvwaFactory {
public static Person createPerson(String people){
Person person=null;
if(people.equalsIgnoreCase("M")) {
person = new Man();
System.out.println("初始化男人对象!");
}
else {
person=new Woman();
System.out.println("初始化女人对象!");
}
return person;
}
}
5.Client类
public class Client {
public static void main(String args[]){
Person person;
person=NvwaFactory.createPerson("W");
person.create();
}
}
添加Robot类之后:
测试代码要添加Robot类,NvwaFactory有变化,其余的类同上。
6.Robot类
public class Robot implements Person{
@Override
public void create() {
System.out.println("制造机器人!");
}
}
7.NvwaFactory类(添加Robot类之后)
public class NvwaFactory {
public static Person createPerson(String people){
Person person=null;
if(people.equalsIgnoreCase("M")) {
person = new Man();
System.out.println("初始化男人对象!");
}
else if (people.equalsIgnoreCase("W")){
person=new Woman();
System.out.println("初始化女人对象!");
}
else{
person=new Robot();
System.out.println("初始化机器人对象");
}
return person;
}
}
8.测试图
二、使用简单工厂模式设计一个可以创建不同几何形状(Shape),例如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制方法draw()和擦除方法erase(),要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常,绘制类图并编程模拟实现。
需提供简单工厂模式实例的结构图(类图)和模拟实现代码。【本题要求使用配置文件来存储参数】
1.Shape接口
public interface Shape {
public void draw();
public void erase();
}
2.Circle类
public class Circle implements Shape{
public void draw(){
System.out.println("draw circle!");
}
public void erase(){
System.out.println("erase circle!");
}
}
3.Rectangle类
public class Rectangle implements Shape{
public void draw(){
System.out.println("draw rectangle!");
}
public void erase(){
System.out.println("erase rectangle!");
}
}
4.Triangle类
public class Triangle implements Shape{
public void draw(){
System.out.println("draw triangle!");
}
public void erase(){
System.out.println("erase triangle!");
}
}
5.ShapeFactory类
public class ShapeFactory {
public static Shape createShape(String type) throws UnsupportedShapeException {
Shape shape=null;
if (type.equalsIgnoreCase("circle")){
shape=new Circle();
System.out.println(" 初始化 Circle!");
}
else if (type.equalsIgnoreCase("rectangle")){
shape=new Rectangle();
System.out.println(" 初始化 Rectangle!");
}
else if(type.equalsIgnoreCase("Triangle")){
shape=new Triangle();
System.out.println(" 初始化 Triangle!");
}
else{
throw new UnsupportedShapeException();
}
return shape;
}
}
6.UnsupportedShapeException类
public class UnsupportedShapeException extends Exception{
public String toString(){
return "no existence!";
}
}
7.Client类
public class Client {
public static void main(String[] args){
String type = XMLUtil.getShapeType(); //读取配置文件中的参数
Shape shape = null;
try {
shape = ShapeFactory.createShape(type);//创建产品对象
shape.draw();
shape.erase();
}catch (UnsupportedShapeException e){
System.out.println(e.toString());
}
}
}
8.配置文件
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil {
//该方法用于从XML配置文件中提取图表类型,并返回类型名
public static String getShapeType() {
try {
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("E:\\software_partern\\code_all\\designpattern_experiment\\src\\Shape1\\shape.xml"));
//获取包含图表类型的文本结点
NodeList nl = doc.getElementsByTagName("shapeType");
Node classNode = nl.item(0).getFirstChild();
String shapeType = classNode.getNodeValue().trim();
return shapeType;
}
catch(Exception e) {
e.printStackTrace();
return null;
}
}
}
9.XML文件
<?xml version="1.0"?>
<config>
<shapeType>circle</shapeType>
</config>
10.测试图
三、 在某网络管理软件中,需要为不同的网络协议提供不同的连接类,例如针对POP3协议的连接类POP3Connection、针对IMAP协议的连接类IMAPConnection、针对HTTP协议的连接类HTTPConnection等。由于网络连接对象的创建过程较为复杂,需要将其创建过程封装到专门的类中,该软件还将支持更多类型的网络协议。
现采用工厂方法模式进行设计,绘制类图并编程模拟实现。需提供工厂方法模式实例的结构图(类图)和模拟实现代码。【本题要求使用配置文件和反射机制实现】
1、ConnectionFactory接口
public interface ConnenctionFactory {
Connection createConnection();
}
2、Connection接口
public interface Connection {
public void setConnection();
}
3、HTTPConnection类
public class HTTPConnection implements Connection{
@Override
public void setConnection() {
System.out.println("成功创建HTTP连接!");
}
}
4、HTTPFactory类
public class HTTPFactory implements ConnenctionFactory{
@Override
public Connection createConnection() {
Connection connection=new HTTPConnection();
System.out.println("创建HTTP连接!");
return connection;
}
}
5、 IMAPConnection类
public class IMAPConnection implements Connection{
@Override
public void setConnection() {
System.out.println("成功创建IMAP连接!");
}
}
6、IMAPFactory类
public class IMAPFactory implements ConnenctionFactory{
@Override
public Connection createConnection() {
Connection connection=new IMAPConnection();
System.out.println("创建IMAP连接!");
return connection;
}
}
7、POP3Connection类
public class POP3Connection implements Connection {
@Override
public void setConnection() {
System.out.println("成功创建POP3连接!");
}
}
8、POP3Factory类
public class POP3Factory implements ConnenctionFactory{
@Override
public Connection createConnection() {
Connection connection = new POP3Connection();
System.out.println("创建POP3连接!");
return connection;
}
}
9、Client类
public class Client {
public static void main(String[] args) {
ConnenctionFactory connenctionFactory;
Connection connection;
connenctionFactory=(ConnenctionFactory)XMLUtil.getBean();
connection=connenctionFactory.createConnection();
connection.setConnection();
}
}
10、XMLUtil类
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil {
public static Object getBean(){
try {
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("E:\\software_partern\\code_all\\designpattern_experiment\\src\\Protocol\\conn.xml"));//此处文件为xml文件的路径
NodeList nl = doc.getElementsByTagName("connection");
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;
}
}
}
11、xml配置文件
<?xml version="1.0" ?>
<config>
<connection>Protocol.HTTPFactory</connection>
</config>
四、 在某FPS(First-Person Shooting Game,第一人称射击) 游戏中提供了多个不同的游戏场景。在每一个游戏场景中,提供了对应的地图(Map)、天气(Weather)和游戏背景音乐(Sound)等。
使用抽象工厂模式设计该系统,使得当用户选择游戏场景时,该场景所对应的地图、天气和背景音乐能够同时出现;此外,还可以方便地在该游戏中增加新的游戏场景。绘制类图并编程模拟实现。
1、SceneFactory接口
public interface SceneFactory {
Map createMap();
Weather createWeather();
Sound createSound();
}
2、SceneFactory1类
public class SceneFactory1 implements SceneFactory{
@Override
public Map createMap() {
return new Map1();
}
@Override
public Weather createWeather() {
return new Weather1();
}
@Override
public Sound createSound() {
return new Sound1();
}
}
3、SceneFactory2类
public class SceneFactory2 implements SceneFactory{
@Override
public Map createMap() {
return new Map2();
}
@Override
public Weather createWeather() {
return new Weather2();
}
@Override
public Sound createSound() {
return new Sound2();
}
}
4、Map接口,Sound接口,Weather接口
public interface Map {
void display();
}
public interface Sound {
void display();
}
public interface Weather {
void display();
}
5、Map1,Map2
public class Map1 implements Map{
@Override
public void display() {
System.out.println("Map1创建成功!");
}
}
public class Map2 implements Map{
@Override
public void display() {
System.out.println("Map2创建成功!");
}
}
6、Sound1,Sound2
public class Sound1 implements Sound{
@Override
public void display() {
System.out.println("Sound1创建成功!");
}
}
public class Sound2 implements Sound{
@Override
public void display() {
System.out.println("Sound2创建成功!");
}
}
7、Weather1,Weather2
public class Weather1 implements Weather{
@Override
public void display() {
System.out.println("Weather1创建成功!");
}
}
public class Weather2 implements Weather{
@Override
public void display() {
System.out.println("Weather2创建成功!");
}
}
8、Clent类
public class Client {
public static void main(String[] args) {
SceneFactory sceneFactory;
Map map;
Weather weather;
Sound sound;
sceneFactory = (SceneFactory) XMLUtil.getBean();
map = sceneFactory.createMap();
weather = sceneFactory.createWeather();
sound = sceneFactory.createSound();
map.display();
weather.display();
sound.display();
}
}
9、XMLUtil
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil {
public static Object getBean(){
try {
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("E:\\software_partern\\code_all\\designpattern_experiment\\src\\FPS_game\\game.xml"));
NodeList nl = doc.getElementsByTagName("scene");
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;
}
}
}
10、配置文件
<?xml version="1.0" ?>
<config>
<scene>FPS_game.SceneFactory2</scene>
</config>
五、 某Web性能测试软件中包含一个虚拟用户生成器(Virtual User Generator)。为了避免出现生成的虚拟用户数量不一致,该测试软件在工作时只允许启动唯一一个虚拟用户生成器。采用单例模式设计该虚拟用户生成器,绘制类图并使用饿汉式单例、双重检测锁和IoDH三种方式编程模拟实现。
类图:
饿汉式单例代码:(这里代码放一起了,在IDEA里面要按类分开,由于作者太懒了下面都没有分类了)
package Web;
public class VirtualUserGenerator {
private static final VirtualUserGenerator instance = new VirtualUserGenerator();
private VirtualUserGenerator() {}
public static VirtualUserGenerator getInstance() {
return instance;
}
public void generateUser() {
System.out.println("生成虚拟用户!");
}
}
package Web;
public class Client {
public static void main(String[] args) {
VirtualUserGenerator generator = VirtualUserGenerator.getInstance();
generator.generateUser();
}
}
双重检测锁:
public class VirtualUserGenerator {
private static volatile VirtualUserGenerator instance;
private VirtualUserGenerator() {}
public static VirtualUserGenerator getInstance() {
if (instance == null) {
synchronized (VirtualUserGenerator.class) {
if (instance == null) {
instance = new VirtualUserGenerator();
}
}
}
return instance;
}
public void generateUser() {
System.out.println("生成虚拟用户2!");
}
}
public class Client {
public static void main(String[] args) {
VirtualUserGenerator generator = VirtualUserGenerator.getInstance();
generator.generateUser();
}
}
IoDH:
public class VirtualUserGenerator {
private VirtualUserGenerator() {}
private static class Holder {
private static final VirtualUserGenerator instance = new VirtualUserGenerator();
}
public static VirtualUserGenerator getInstance() {
return Holder.instance;
}
public void generateUser() {
System.out.println("生成虚拟用户3!");
}
}
public class Client {
public static void main(String[] args) {
VirtualUserGenerator generator = VirtualUserGenerator.getInstance();
generator.generateUser();
}
}
分享一句很喜欢的话:
前路漫漫,慢慢亦灿灿,我们终会去到想去的地方,见到想见到的人!