设计模式——创建型模型

目录

  1. 单例模式(singleton)
  2. 构建模式(Builder)
  3. 原型模式(Prototype)
  4. 工厂方法模式(Factory)
  5. 抽象工厂模式(Abstract Factory)

**

一、5种创建型模型

**

1.1 单例模式(singleton)

简介:
单例模式特别简单,目的是为类创建唯一的对象。
下面是单例模式的一种实现方式(单例模式的5种实现方式见,传送门):

public class Singleton {    private volatile static Singleton singleton = null; //volatile关键字private Singleton(){} //私有化构造函数,使其不可继承public static Singleton getInstance() {if(singleton == null) {synchronized (Singleton.class) {if(singleton == null) {//double check,保证效率、安全性singleton = new Singleton();}}}return singleton;}
}

1.2 构建模式(Builder)

简介:
将一个复杂对象的构建和表现分离,使得不同的构建过程可以创建不同的表示
类图:

在这里插入图片描述

代码如下:

public class Product {/*** 定义一些关于产品的操作*/private String part1;private String part2;public String getPart1() {return part1;}public void setPart1(String part1) {this.part1 = part1;}public String getPart2() {return part2;}public void setPart2(String part2) {this.part2 = part2;}}
public interface Builder {public void buildPart1();public void buildPart2();public Product retrieveResult();}
public class ConcreteBuilder implements Builder {private Product product = new Product();/*** 产品零件建造方法1*/@Overridepublic void buildPart1() {//构建产品的第一个零件product.setPart1("编号:9527");}/*** 产品零件建造方法2*/@Overridepublic void buildPart2() {//构建产品的第二个零件product.setPart2("名称:XXX");}/*** 产品返还方法*/@Overridepublic Product retrieveResult() {return product;}
}
public class Director {/*** 持有当前需要使用的建造器对象*/private Builder builder;/*** 构造方法,传入建造器对象* @param builder 建造器对象*/public Director(Builder builder){this.builder = builder;}/*** 产品构造方法,负责调用各个零件建造方法*/public void construct(){builder.buildPart1();builder.buildPart2();}
}
public class Client {public static void main(String[]args){Builder builder = new ConcreteBuilder();Director director = new Director(builder);director.construct();Product product = builder.retrieveResult();System.out.println(product.getPart1());System.out.println(product.getPart2());}}

1.3 原型模式(Prototype)

简介:
原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个对象实例来创建新的实例。通过原型来创建对象,就不需要关心实例本身的类型,只要实现了克隆自身的方法,就可以通过这 个方法获取新的对象,而无需new
原型模式有两种表现形式:1)简单形式 2)登记形式

类图:

在这里插入图片描述
代码如下:

public interface Prototype{public Prototype clone();public String getName();public void setName(String name);
}
public class ConcretePrototype1 implements Prototype {private String name;public Prototype clone(){ConcretePrototype1 prototype = new ConcretePrototype1();prototype.setName(this.name);return prototype;}public String toString(){return "Now in Prototype1 , name = " + this.name;}@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name = name;}
}
public class ConcretePrototype2 implements Prototype {private String name;public Prototype clone(){ConcretePrototype2 prototype = new ConcretePrototype2();prototype.setName(this.name);return prototype;}public String toString(){return "Now in Prototype2 , name = " + this.name;}@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name = name;}
}
public class PrototypeManager {/*** 用来记录原型的编号和原型实例的对应关系*/private static Map<String,Prototype> map = new HashMap<String,Prototype>();/*** 私有化构造方法,避免外部创建实例*/private PrototypeManager(){}/*** 向原型管理器里面添加或是修改某个原型注册* @param prototypeId 原型编号* @param prototype    原型实例*/public synchronized static void setPrototype(String prototypeId , Prototype prototype){map.put(prototypeId, prototype);}/*** 从原型管理器里面删除某个原型注册* @param prototypeId 原型编号*/public synchronized static void removePrototype(String prototypeId){map.remove(prototypeId);}/*** 获取某个原型编号对应的原型实例* @param prototypeId    原型编号* @return    原型编号对应的原型实例* @throws Exception    如果原型编号对应的实例不存在,则抛出异常*/public synchronized static Prototype getPrototype(String prototypeId) throws Exception{Prototype prototype = map.get(prototypeId);if(prototype == null){throw new Exception("您希望获取的原型还没有注册或已被销毁");}return prototype;}
}
public class Client {public static void main(String[]args){try{Prototype p1 = new ConcretePrototype1();PrototypeManager.setPrototype("p1", p1);//获取原型来创建对象Prototype p3 = PrototypeManager.getPrototype("p1").clone();p3.setName("张三");System.out.println("第一个实例:" + p3);//有人动态的切换了实现Prototype p2 = new ConcretePrototype2();PrototypeManager.setPrototype("p1", p2);//重新获取原型来创建对象Prototype p4 = PrototypeManager.getPrototype("p1").clone();p4.setName("李四");System.out.println("第二个实例:" + p4);//有人注销了这个原型PrototypeManager.removePrototype("p1");//再次获取原型来创建对象Prototype p5 = PrototypeManager.getPrototype("p1").clone();p5.setName("王五");System.out.println("第三个实例:" + p5);}catch(Exception e){e.printStackTrace();}}
}

1.4 工厂方法模式(Factory)

简介:
工厂方法的用意是定义一个创建对象的工厂接口,将实际创建工作推迟到子类中。

类图:(工厂与抽象工厂)

在这里插入图片描述

代码如下:


interface Product {}class ProductA implements Product {}class ProductB implements Product {}abstract class Factory {public abstract Product makeProduct();}class FactoryA extends Factory {@Overridepublic Product makeProduct() {return new ProductA();}}class FactoryB extends Factory {@Overridepublic Product makeProduct() {return new ProductB();}}public class Client {public static void main(String[] args) {Factory factory = new FactoryA();Product product = factory.makeProduct();//对象为:com.obob.test.ProductA@15db9742System.out.println(product);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mr. Panda and Kakin(拓展欧几里得 + O(1)快速乘)

Mr. Panda and Kakin 给定n,cn, cn,c&#xff0c;要我们找到nnn是两个相邻质数的乘积&#xff0c;要我们找到xxx&#xff0c;满足x2303≡c(modn)x ^{2 ^{30} 3} \equiv c \pmod nx2303≡c(modn)&#xff0c;1010≤n≤1018,0<c<n10 ^{10} \leq n \leq 10 ^ {18}, 0 <…

【C】KoobooJson在asp.net core中的使用

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。本文链接&#xff1a;https://blog.csdn.net/j_teng/article/details/100924973“KoobooJson是一款体积小巧没有任何依赖且性能表现强劲的Json工具…

单例模式的创建方式

说明&#xff1a; 以下均为线程安全的实现方式。 懒汉、饿汉的非线程安全的意义不大&#xff0c;未实现。 1. 饿汉模式 类初始化时直接创建对象 public class Singleton {private static Singleton singleton new Singleton();//饿汉模式&#xff0c;类初始化时直接创建pub…

P3899 [湖南集训]谈笑风生(线段树合并)

P3899 [湖南集训]谈笑风生 给定一颗以111号节点为根的树&#xff0c;如果a≠ba \neq ba​b&#xff0c;且aaa是bbb的祖先&#xff0c;则aaa比bbb更厉害&#xff0c;如果a≠ba \neq ba​b&#xff0c;且dis(a,b)≤xdis(a, b) \leq xdis(a,b)≤x&#xff0c;xxx为给定的一个…

【DevOps进行时】C/S端界面自动化测试:微软UIAutomation实践

在界面自动化测试领域里存在许多流行的自动化测试工具&#xff0c;例如目前比较受欢迎的开源自动化工具Selenium、Katalon&#xff1b;HP旗下知名的商业软件Unified Functional Testing(更名前叫QTP)&#xff1b;隶属于IBM以数据驱动测试的RTF&#xff08;Rational Functional …

代码编辑器横评:为什么 VS Code 能拔得头筹

2015 年 4 月 29 日的 Build 大会上&#xff0c;微软发布了 Visual Studio Code 第一个预览版本。短短四年时间里&#xff0c;VS Code 高速成长。根据 2019 年 2 月的 PYPL Top IDE index 的排名&#xff0c;VS Code 的涨势迅猛&#xff0c;在所有编辑器与 IDE 中排名第六&…

A. Slackline Adventure(思维 + 莫比乌斯)(2018-2019 ACM-ICPC Brazil Subregional Programming Contest)

A. Slackline Adventure 考虑枚举每个矩形的长跟宽&#xff0c;再统计这个矩形能在坐标轴上出现几次&#xff08;同行相邻同列相邻的单独算&#xff09;&#xff0c;然后有如下式子&#xff1a; 2∑i1n−1∑j1m−1(n−i)(m−j)[gcd⁡(i,j)1][L2≤i2j2≤R2]2 \times \sum_{i 1…

设计模式——结构型模型

一&#xff1a;目录 1. 装饰者模式&#xff08;Decorator&#xff09; 2. 代理模式&#xff08;Proxy&#xff09; 3. 组合模式&#xff08;Composite&#xff09; 4. 桥接模式&#xff08;Bridge&#xff09; 5. 适配器模式&#xff08;Adapter&#xff09; 6. 蝇量模式&#…

D. Best Edge Weight(最小生成树 + 树链剖分)(Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals))

D. Best Edge Weight 给定一个有nnn个点mmm条边的无向连通图&#xff0c;有mmm次询问&#xff0c;每次询问第iii条边的权值最大为多少&#xff0c;这张图的所有最小生成树的方案中&#xff0c;一定包含第iii条边。 先跑一边最小生成树&#xff0c;得到最小生成树&#xff0c;…

利用Helm简化Kubernetes应用部署(1)

目录利用Helm简化Kubernetes应用部署 Helm基础 安装Helm 使用Visual Studio 2019为Helm编写一个简单的应用 利用Helm简化Kubernetes应用部署Helm是Kubernetes生态系统中的一个软件包管理工具&#xff0c;有点类似于Linux操作系统里面的“apt-get”和“yum”。结合上一节内容&am…

设计模式——行为型模式

一&#xff1a;目录 1. 策略模式&#xff08;Strategy&#xff09; 2.状态模式&#xff08;State&#xff09; 3.责任链模式&#xff08;Chain Of Responsibility&#xff09; 4.解释器模式&#xff08;Interpreter&#xff09; 5.命令模式&#xff08;Command&#xff09; 6.观…

2019 ICPC Asia Yinchuan Regional(9 / 13)

2019 ICPC Asia Yinchuan Regional A - Girls Band Party&#xff08;分组背包&#xff09; 每个物品有两个标签&#xff0c;名字&#xff0c;颜色&#xff0c;当名字是设置为奖赏时会对整体加上0.1 的贡献&#xff0c;如果颜色符合要求时 会对整体加上 0.2 的的贡献 但是有…

网络编程——常用协议解析

** 1、网络基础知识 ** 1.1> 什么是OSI模型 OSI 模型(Open System Interconnection model)是一个由国际标准化组织?提出的概念模型,试图?供一个使各种不同的计算机和网络在世界范围内实现互联的标准框架。 它将计算机网络体系结构划分为七层,每层都可以提供抽象良好的…

在 ABP vNext 中编写仓储单元测试的问题一则

一、问题新项目是基于 ABP vNext 框架进行开发的&#xff0c;所以我要求为每层编写单元测试。在同事为某个仓储编写单元测试的时候&#xff0c;发现了一个奇怪的问题。他的对某个聚合根的 A 字段进行了更新&#xff0c;随后对某个导航属性 B 也进行了变更&#xff0c;最后通过仓…

TCP协议——三次握手与四次关闭

1. TCP协议基础 网络编程基础见&#xff0c;传送门 TCP是面向连接的&#xff0c;无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。 在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接服务&#xff0c;连接是通过三次握手进行初始化的。 三次握手…

在 .NET Core 3.0 中实现 JIT 编译的 JSON 序列化,及一些心得与随想

源码&#xff1a;https://github.com/Martin1994/JsonJitSerializerNuGet&#xff1a;https://www.nuget.org/packages/MartinCl2.Text.Json.Serialization/简介&#xff1a;Just-in-time 编译的 JSON 序列化&#xff0c;基于 System.Text.Json.NET Core 3.0 即将正式发布&…

E. Company(Codeforces Round #520 (Div. 2))

E. Company 给定一颗有nnn个节点的树&#xff0c;有mmm次询问&#xff0c;每次询问给定[l,r][l, r][l,r]&#xff0c;我们可以选择删除其中的一个点ppp&#xff0c;然后找到一个深度最深的rtrtrt&#xff0c;使得剩下的点都在rtrtrt的子树上。 考虑对编号为[l,r][l, r][l,r]中…

TCP协议——流量控制和拥塞控制

** 一、流量控制 ** 1.1 什么是流量控制 Sender won’t overflow receiver’s buffer by transmitting too much, too fast. &#xff08;防止发送方发的太快&#xff0c;耗尽接收方的资源&#xff0c;从而使接收方来不及处理&#xff09; 1.2 流量控制的一些知识点 &#x…

征集.NET中国峰会议题

月初做的调查《》&#xff0c;参与人数576人&#xff0c;愿意参与分享.NET Core经验的142人&#xff0c;今天发起分会场主题演讲和闪电演讲议题.2014年微软组织成立.NET基金会&#xff0c;微软在成为主要的开源参与者的道路上又前进了一步。2014年以来已经有众多知名公司加入.N…

TCP协议——粘包与拆包

TCP的基础 TCP协议基础&#xff0c;传送门 TCP协议流量控制&#xff0c;传送门 1.1 什么是TCP粘包/拆包 TCP是个“流”协议&#xff0c;所谓流&#xff0c;就是没有界限的一串数据。大家可以想想河里的流水&#xff0c;是连成一片的&#xff0c;其间并没有分界线。TCP底层并…