写在前面

在网上抄个作业居然要不没有,要不要钱!老子有个屁的钱,气得我直接写完了,分享在这里供借鉴(抄可以,但你得会了再抄)。随便转载,可以不署我名但需要声明非原创。
这是一系列的作业,所以也气了我一系列,不想后来人受气了。
本作业对《图解设计模式》这本书有不小内容的借鉴,在此感谢并推荐。

创建型设计模式实验

1、简单工厂

题目:使用简单工厂模式设计一个可以创建不同几何形状( Shape)(例如圆形( Circle).、矩形 Rectangle)和三角形( ( Triangle)等的绘图工具类,每个几何图形均具有绘制方法daw()和擦除方法 erase(),要求在绘制不支持的几何图形时,抛出一个 UnsupportedShapeException异常。绘制类图并编程模拟实现。

类图

编程实现
package TemplateMethod;public abstract class AbstractDraw {public void draw(){throw new UnsupportedShapedException("绘制了不能绘制的图形");}public abstract void erase();
}package TemplateMethod;public class Circle extends AbstractDraw{@Overridepublic void erase() {System.out.println("圆形已经被清除");}
}package TemplateMethod;public class Rectangle extends AbstractDraw{@Overridepublic void draw() {System.out.println("三角形已经绘制好了");}@Overridepublic void erase() {System.out.println("矩形已经被清除");}
}package TemplateMethod;public class Triangle extends AbstractDraw{@Overridepublic void draw() {System.out.println("矩形已经绘制好了");}@Overridepublic void erase() {System.out.println("三角形已经被清除");}
}package TemplateMethod;public class UnsupportedShapedException extends RuntimeException{public UnsupportedShapedException(){}public UnsupportedShapedException(String strings){super(strings);}
}package TemplateMethod;public class Main{public static void main(String[] args){AbstractDraw c = new Circle();AbstractDraw r = new Rectangle();AbstractDraw t = new Triangle();r.draw();t.draw();t.erase();c.draw();}
}
运行结果

2、工厂方法

题目:在某网络管理软件中,需要为不同的网络协议提供不同的连接类,例如针对POP3协议的连接类POP3Connection、针对IMAP协议的连接类 IMAPConnection、针对HTTP协议的连接类 HTTPConnection等。由于网络连接对象的创建过程较为复杂,需要将其创建过程封装到专门的类中,该软件还将支持更多类型的网络协议。现采用工厂方法模式进行设计,绘制类图并编程模拟实现。

类图

编程实现
package FactoryMethod.Connection;import FactoryMethod.FrameWork.Product;public class HTTPConnection extends Product {private String owner;HTTPConnection(String owner){this.owner = owner;System.out.println("为用户" + owner + "创建了HTTPConnection连接类");}@Overridepublic void use() {System.out.println("用户" + owner + "在使用HTTPConnection连接类");}public String  getOwner() {return owner;}
}package FactoryMethod.Connection;import FactoryMethod.FrameWork.Factory;
import FactoryMethod.FrameWork.Product;import java.util.ArrayList;
import java.util.List;public class HTTPFactory extends Factory {private List<String> owners = new ArrayList();@Overrideprotected Product createProduct(String owner) {return new HTTPConnection(owner);}@Overrideprotected void registerProduct(Product product) {owners.add(((HTTPConnection)product).getOwner());}public List getOwners(){return owners;}
}package FactoryMethod.Connection;import FactoryMethod.FrameWork.Product;public class IMAPConnection extends Product {private String owner;IMAPConnection(String owner){this.owner = owner;System.out.println("为用户" + owner + "创建了IMAPConnection连接类");}@Overridepublic void use() {System.out.println("用户" + owner + "在使用IMAPConnection连接类");}public String  getOwner() {return owner;}
}package FactoryMethod.Connection;import FactoryMethod.FrameWork.Factory;
import FactoryMethod.FrameWork.Product;import java.util.ArrayList;
import java.util.List;public class IMAPFactory extends Factory {private List<String> owners = new ArrayList();@Overrideprotected Product createProduct(String owner) {return new IMAPConnection(owner);}@Overrideprotected void registerProduct(Product product) {owners.add(((IMAPConnection)product).getOwner());}public List getOwners(){return owners;}
}package FactoryMethod.Connection;import FactoryMethod.FrameWork.Product;public class POP3Connection extends Product {private String owner;POP3Connection(String owner){this.owner = owner;System.out.println("为用户" + owner + "创建了POP3Connection连接类");}@Overridepublic void use() {System.out.println("用户" + owner + "在使用POP3Connection连接类");}public String  getOwner() {return owner;}
}package FactoryMethod.Connection;import FactoryMethod.FrameWork.Factory;
import FactoryMethod.FrameWork.Product;import java.util.ArrayList;
import java.util.List;public class POP3Factory extends Factory {private List<String> owners = new ArrayList();@Overrideprotected Product createProduct(String owner) {return new POP3Connection(owner);}@Overrideprotected void registerProduct(Product product) {owners.add(((POP3Connection)product).getOwner());}public List getOwners(){return owners;}
}package FactoryMethod.FrameWork;public abstract class Factory {public final Product create(String owner){Product n = createProduct(owner);registerProduct(n);return n;}protected abstract Product createProduct(String owner);protected abstract void registerProduct(Product product);
}package FactoryMethod.FrameWork;public abstract class Product {public abstract void use();
}package FactoryMethod;import FactoryMethod.Connection.HTTPFactory;
import FactoryMethod.Connection.IMAPFactory;
import FactoryMethod.Connection.POP3Factory;
import FactoryMethod.FrameWork.Factory;
import FactoryMethod.FrameWork.Product;public class Main {public static void main(String[] args){Factory pop3Factory = new POP3Factory();Factory ImapFactory = new IMAPFactory();Factory HttpFactory = new HTTPFactory();Product pop3 = pop3Factory.create("伞兵一号");Product imap = ImapFactory.create("变量A");pop3.use();}
}
运行结果

3、抽象工厂

题目:某系统为了改进数据库操作的性能,用户可以自定义数据库连接对象 Connection和语句对象 Statement,针对不同类型的数据库提供不同的连接对象和语句对象,例如提供 Oracle或 MySQL专用连接类和语句类,而且用户可以通过配置文件等方式根据实际需要动态更换系统数据库。使用抽象工厂模式设计该系统,绘制对应的类图并编程模拟实现。

类图

编程实现
package AbstractFactory;public class Connection {public void connection(){}
}package AbstractFactory;public abstract class databaseFactory {public abstract Connection createConnection();public abstract Statement createStatement();
}package AbstractFactory;public class Main {public static void main(String[] args) {String databaseType = "Mysql";Class clazz;Object object = null;try {clazz = Class.forName("AbstractFactory." + databaseType+"Factory");object = clazz.newInstance();} catch (Exception e) {e.printStackTrace();}databaseFactory daFactory = (databaseFactory) object;Connection connection ;Statement statement;connection = daFactory.createConnection();statement = daFactory.createStatement();connection.connection();statement.statement();}}package AbstractFactory;public class mysqlConnection extends Connection {public void connection() {System.out.println("提供MySql连接对象");}}package AbstractFactory;public class MysqlFactory extends databaseFactory {@Overridepublic Connection createConnection() {return new mysqlConnection();}@Overridepublic Statement createStatement() {return new mysqlStatement();}}package AbstractFactory;public class mysqlStatement extends Statement{public void statement() {System.out.println("提供mysql语句对象");}
}package AbstractFactory;public class oracleConnection extends Connection {public void connection() {System.out.println("提供oracle连接对象");}}package AbstractFactory;public class OracleFactory extends databaseFactory{@Overridepublic Connection createConnection() {return new oracleConnection();}@Overridepublic Statement createStatement() {return new oracleStatement();}
}package AbstractFactory;public class oracleStatement extends Statement {public void statement() {System.out.println("提供oracle语句对象");}
}package AbstractFactory;public class Statement {public void statement(){}
}
运行结果
为Mysql时

为Oracle时

4、建造者模式

题目:在某赛车游戏中,赛车包括方程式赛车、场地野赛车、运动汽车、卡车等类型,不同类型的赛车的车身、发动机、轮胎、变速箱等部件有所区别。玩家可以自行选择赛车类型,系统将根据玩家的选择创建出一辆完整的赛车。现采用建造者模式实现赛车的构建,绘制对应的类图并编程模拟实现

类图

编程实现
package Builder;public abstract class Builder {public abstract void carBody(String string);public abstract void engine(String string);public abstract void tire(String string);public abstract void gearbox(String string);public abstract void over(String string);
}package Builder;public class Director {private Builder builder;public Director(Builder builder){this.builder = builder;}public void construct(){builder.carBody("您的车身正在打造,请等待");builder.engine("您的发动机正在打造,请等待");builder.gearbox("您的变速箱正在打造,请等待");builder.tire("您的轮胎正在打造,请等待");builder.over("恭喜您");}
}package Builder;public class FormulaCar extends Builder{@Overridepublic void carBody(String string) {System.out.println(string + "\n系统为您打造了方程式赛车的车身!");}@Overridepublic void engine(String string) {System.out.println(string + "\n系统为您打造了方程式赛车的发动机!");}@Overridepublic void tire(String string) {System.out.println(string + "\n系统为您打造了方程式赛车的轮胎!");}@Overridepublic void gearbox(String string) {System.out.println(string + "\n系统为您打造了方程式赛车的变速箱!");}@Overridepublic void over(String string) {System.out.println(string + "\n您的方程式赛车已完成打造!");}
}package Builder;public class Main {public static void main(String[] args){Builder truck = new Truck();Builder formulaCar = new FormulaCar();Builder sportCarBuilder = new SportCarBuilder();Director truck1 = new Director(truck);Director formulaCar1 = new Director(formulaCar);Director sportCarBuilder1 = new Director(sportCarBuilder);truck1.construct();formulaCar1.construct();sportCarBuilder1.construct();}
}package Builder;public class SportCarBuilder extends Builder{@Overridepublic void carBody(String string) {System.out.println(string + "\n系统为您打造了运动汽车的车身!");}@Overridepublic void engine(String string) {System.out.println(string + "\n系统为您打造了运动汽车的发动机!");}@Overridepublic void tire(String string) {System.out.println(string + "\n系统为您打造了运动汽车的轮胎!");}@Overridepublic void gearbox(String string) {System.out.println(string + "\n系统为您打造了运动汽车的变速箱!");}@Overridepublic void over(String string) {System.out.println(string + "\n您的运动汽车已完成打造!");}
}package Builder;public class Truck extends Builder{@Overridepublic void carBody(String string) {System.out.println(string + "\n系统为您打造了卡车的车身!");}@Overridepublic void engine(String string) {System.out.println(string + "\n系统为您打造了卡车的发动机!");}@Overridepublic void tire(String string) {System.out.println(string + "\n系统为您打造了卡车的轮胎!");}@Overridepublic void gearbox(String string) {System.out.println(string + "\n系统为您打造了卡车的变速箱!");}@Overridepublic void over(String string) {System.out.println(string + "\n您的卡车已完成打造!");}
}
运行结果

5、原型模式

题目:某在线招聘网站中,用户可以创建一个简历模板。针对不同的工作岗位,可以复制该简历模板并进行适当修改后,生成一份新的简历。在复制简历时,用户可以选择是否复制简历中的照片:如果选择“是”,则照片将一同被复制,用户对新简历中的照片进行修改不会影响到简历模板中的照片,对模板进行修改也不会影响到新简历;如果选择“否”,则直接引用简历模板中的照片,修改简历模板中的照片将导致新简历中的照片一同修改,反之亦然。现采用原型模式设计该简历复制功能并提供浅克隆和深克隆两套实现方案,绘制对应的类图并编程模拟实现。

类图

编程实现
package Prototype.FrameWork;import java.util.HashMap;public class Manager {//    private HashMap showcase = new HashMap();
//    public void register(String name, Product proto) {//        showcase.put(name,proto);
//    }public Product create(Boolean bool, Product product) {//Product p = (Product) showcase.get(protoname);return product.createClone(bool);}
}package Prototype.FrameWork;public interface Product extends Cloneable{void use(String s,String picture);Product createClone(Boolean bool);
}package Prototype;import Prototype.FrameWork.Manager;
import Prototype.FrameWork.Product;public class Main {public static void main(String[] args){Manager manager = new Manager();Picture picture1 = new Picture("一只猫");Picture picture2 = new Picture("一只狗");Resume abc = new Resume("个人信息",picture1);abc.use("","");Product a = manager.create(true,abc); //true为深克隆,false为浅克隆a.use("","");abc.picture.newPicture("一只狗");//abc.reset("",picture2);abc.use("","");a.use("","");//   manager.register("haha",abc);//  Product a = manager.create("haha");//  a.use("123","");//  abc.reset("模板简历更新啦",picture2);//  a.use("456","");//  Product c = manager.create("haha");//  c.use("789","");//  manager.register("xixi",abc);//  Product b = manager.create("xixi");//  b.use("","");}
}package Prototype;import Prototype.FrameWork.Product;public class Picture implements Product {private String pic = "原始图片";public Picture(){}public Picture(String pic){this.pic = pic;}public void newPicture(String pic){this.pic = pic;}public String getPic(){return this.pic;}@Overridepublic Product createClone(Boolean bool) {if(bool){Picture p = null;try {p = (Picture) clone();}catch (CloneNotSupportedException e) {e.printStackTrace();}return p;}else return this;}@Overridepublic void use(String s, String picture) {System.out.println("第一个" + s + "第二个" + picture);}
}package Prototype;import Prototype.FrameWork.Product;public class Resume implements Product {private String s = "这是主体部分,在这里可以插入简历内容:";public Picture picture;public Resume(){}public Resume(String s, Picture picture){this.s = s;this.picture = picture;}public Resume getPicture(Resume resume){return resume;}public void reset(String s, Picture picture){this.s = s;this.picture = picture;}@Overridepublic void use(String s, String picture) {if(this.picture != null){System.out.println(this.s + "    " + s + "\n" + this.picture.getPic() + "   " + picture);}else  System.out.println(this.s + "    " + s + "\n" + "咕噜咕噜" + "   " + picture);}@Overridepublic Product createClone(Boolean bool) {Resume p = null;try {p = (Resume) clone();p.picture = (Picture) p.picture.createClone(bool);}catch (CloneNotSupportedException e) {e.printStackTrace();}return p;}
}
运行结果
深克隆

浅克隆

6、单例模式

题目:某Web性能测试软件中包含一个虚拟用户生成器( Virtual User Generator)。为了避免生成的虚拟用户数量不一致,该测试软件在工作时只允许启动唯一一个虚拟用户生成器。采用单例模式设计该虚拟用户生成器,绘制类图并分别使用饿汉式单例、双重检测锁、IoDH这三种方式编程模拟实现。

提示

由于main类与运行结果都相同,所以只记录第一个TheHungry的。

TheHungry

类图

编程实现
package Singleton.TheHungry;public class Main {public static void main(String[] args){System.out.println("性能测试开始啦");Singleton user1 = Singleton.getInstance();Singleton user2 = Singleton.getInstance();if(user1 == user2){System.out.println("user1与user2是相同的虚拟用户");}else {System.out.println("这是两个不同的实例");}System.out.println("性能测试结束!");}
}package Singleton.TheHungry;public class Singleton {private static Singleton singleton = new Singleton();private Singleton() {System.out.println("生成了一个虚拟用户");}public static Singleton getInstance(){return singleton;}
}
运行结果

DoubleChecked

类图

编程实现
package Singleton.DoubleChecked;public class Singleton {private volatile Singleton singleton;private Singleton() {System.out.println("生成了一个虚拟用户");}public static Singleton getInstance(){if(singleton == null){synchronized (Singleton.class){if(singleton == null){singleton = new Singleton();}}}return singleton;}
}
运行结果

IoDH

类图

编程实现
package Singleton.IoDH;public class Singleton {private Singleton() {System.out.println("生成了一个虚拟用户");}private static class HolderClass {private final static Singleton singleton = new Singleton();}public static Singleton getInstance(){return HolderClass.singleton;}
}

.DoubleChecked;

public class Singleton {
private volatile Singleton singleton;
private Singleton() {
System.out.println(“生成了一个虚拟用户”);
}
public static Singleton getInstance(){
if(singleton == null){
synchronized (Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}


##### 运行结果#### IoDH##### 类图[外链图片转存中...(img-nsTv2j4D-1635506203761)]##### 编程实现```java
package Singleton.IoDH;public class Singleton {private Singleton() {System.out.println("生成了一个虚拟用户");}private static class HolderClass {private final static Singleton singleton = new Singleton();}public static Singleton getInstance(){return HolderClass.singleton;}
}

02.创建型设计模式实验相关推荐

  1. 技术图文:02 创建型设计模式(下)

    创建型设计模式(下) 知识结构: 图1 知识结构 单例模式 – 确保对象的唯一性 Sunny 软件公司承接了一个服务器负载均衡软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量 ...

  2. 技术图文:02 创建型设计模式(上)

    创建型设计模式(上) 知识结构: 图1 知识结构 简单工厂模式 Sunny 软件公司欲基于 C# 语言开发一套图表库,该图表库可以为应用系统提供各种不同外观的图表,如: 柱状图(histogram) ...

  3. JavaScript设计模式之创建型设计模式

    此系列总结与<JavaScript设计模式>,总共分为创建型设计模式.结构型设计模式.行为型设计模式.技巧型设计模式和架构性设计模式五大类. github原文地址:YOU-SHOULD-K ...

  4. 创建型设计模式(待更新)

    前言 - 熟能生巧(★★★) 关于设计模式的学习,需要结合具体的应用场景进行理解,即站在用户的角度去理解需求,目的是让自己设计的代码能够为用户提供统一的接口,并且设计的模块具有高内聚低耦合.有更好的可 ...

  5. javaScript设计模式-创建型设计模式

    我们大家一听到设计模式就感觉设计模式是一个高端的东西,到底什么是设计模式呢?其实设计模式也就是我们的前辈在写代码的时候遇到的问题,提出的解决方案,为了方便人与人之间的交流,取了个名字,叫做设计模式. ...

  6. 创建型设计模式对比总结 设计模式(八)

    创建型模式是new 的一种替代方式,可以将对象的创建与具体的类型进行分离 目前已经介绍了5种创建型设计模式(如果简单工厂算一种的话,那就是6种) 分别是: 简单工厂模式.工厂方法模式.抽象工厂模式.建 ...

  7. java面向对象程序设计第三版_JAVA面向对象程序设计之创建型设计模式

    [本文详细介绍了JAVA面向对象程序设计中的创建型设计模式,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 1.1 什么是设计模式 设计模式( Design pattern )是一套被反复使用.多数 ...

  8. 《Python编程实战:运用设计模式、并发和程序库创建高质量程序》—— 第1章 Python的创建型设计模式...

    本节书摘来自华章出版社<Python编程实战:运用设计模式.并发和程序库创建高质量程序>一 书中的第1章,第1.1节,作者:(美) Mark Summerfield,更多章节内容可以访问云 ...

  9. 从框架源码中学习创建型设计模式

    文章目录 从框架源码中解读创建型设计模式 工厂模式 案例一:RocketMQ源码-创建Producer生产者 案例二:RocketMQ源码-创建过滤器工厂 抽象工厂 案例一:Dubbo源码-创建缓存的 ...

最新文章

  1. linux c之孤儿进程与僵尸进程[总结]
  2. c语言函数的使用步骤,c语言打开文件函数使用方法
  3. kb4023057安装失败_微软重发Win10 KB4023057 补丁,推动Win10更新
  4. VMware 即使克隆解析
  5. 浅论园子的人对广告的认识
  6. Day01_FAT12 文件系统
  7. 廖雪峰Python教程练习题
  8. .NET破解之谷歌地图下载助手-睿智版
  9. c# AD域 权限管理
  10. php web应用 开发工具,phpEclipse开发工具(二 web应用)
  11. SpeechSynthesisUtterance 语音合成使用 文字语音播报
  12. 其他技术 网易云音乐Mp3,通过网易官方搜索引擎获取mp3外链
  13. C++面向对象特性之多态
  14. 类模板和函数模板的区别及其应用案例 c++ 简单易懂
  15. Stetho调试神器使用
  16. Dependency ‘taglibs:standard:1.1.2‘ not found
  17. operator=的用法
  18. CSS选择器权重计算与优先级
  19. Python简要学习教程
  20. 竞赛经验分享 NUIST CEEE慕课计划【1】—— 全国大学生集成电路创新创业大赛

热门文章

  1. 轻松为您解决中文简繁转换的苦恼
  2. sql语句中 limi的用法
  3. 永恒python怎么强化_python 进程
  4. [收集]什么是父表和子表
  5. vue 微信公众号支付接口_vue页面在微信公众号调用支付接口
  6. “任务管理器”中“进程”各个选项卡的含义
  7. 广西科技大学鹿山学院计算机,广西科技大学鹿山学院--土木工程VR实训中心
  8. python将灰度图保存为8bit彩色图
  9. LOL班德尔城服务器位置,英雄联盟世界地图符文之地上线 找不到班德尔城竟然是官方玩笑?...
  10. 学习Qlik函数match 与 pick 的用法