设计模式GOF23(创建型模式)
单例模式:
package com.bjsxt.design;
public class SingletonDemo1 {
//类初始化就加载这个对象,因为类初始化就加载了所以线程是安全的
private static SingletonDemo1 instance=new SingletonDemo1();
private SingletonDemo1(){}
//方法不需要同步,效率高
public static SingletonDemo1 getInstance(){
return instance;
}
}
package com.bjsxt.design;
public class Client {
public static void main(String[] args) {
SingletonDemo1 demo1=SingletonDemo1.getInstance();
SingletonDemo1 demo11=SingletonDemo1.getInstance();
System.out.println(demo1==demo11);
}
}
true表示俩者地址一样
package com.bjsxt.design;
public class SingletonDemo2 {
//类初始化不加载对象
private static SingletonDemo2 instance;
private SingletonDemo2(){}
//需要则加载,利用效率高,但是线程不安全
public static synchronized SingletonDemo2 getInstance(){
if (instance==null){
instance=new SingletonDemo2();
}
return instance;
}
}
package com.bjsxt.design;
public class Client {
public static void main(String[] args) {
SingletonDemo2 demo2=SingletonDemo2.getInstance();
SingletonDemo2 demo22=SingletonDemo2.getInstance();
System.out.println(demo2==demo22);
}
}
public class SingletonDemo03 {
private static SingletonDemo03 instance = null;
public static SingletonDemo03 getInstance() {
if (instance == null) {
SingletonDemo03 sc;
synchronized (SingletonDemo03.class) {
sc = instance; if (sc == null) {
synchronized (SingletonDemo03.class) {
if(sc == null) { sc = new SingletonDemo03();
}
}
instance = sc;
}
}
}
return instance;
}
private SingletonDemo03() {
}
}
package com.bjsxt.design;
public class SingletonDemo4 {
private static class SingetonClassInstance{
private static final SingletonDemo4 instance=new SingletonDemo4();
}
private SingletonDemo4(){}
public static SingletonDemo4 getInstance(){
return SingetonClassInstance.instance;
}
}
package com.bjsxt.design;
import java.io.ObjectStreamException;
/**
* 防止反射的反序列化
*/
public class SingletonDemo6 {
//类初始化就加载这个对象,因为类初始化就加载了所以线程是安全的
private static SingletonDemo6 instance=new SingletonDemo6();
private SingletonDemo6(){
//阻止反射调用
if (instance!=null){
throw new RuntimeException();
}
}
//阻止通过反序列化
private Object readResolve() throws ObjectStreamException{
return instance;
}
//方法不需要同步,效率高
public static SingletonDemo6 getInstance(){
return instance;
}
}
package com.bjsxt.design;
public enum SingletonDemo5 {
Insatnce;
public void SingletonOperation(){
}
}

工厂模式:
面向对象设计的基本原则:
package com.bjsxt.factory;
public class Client01 {
public static void main(String[] args) {
Car benChi=new BenChi();
benChi.run();
Car bmw=new BMW();
bmw.run();
}
}
package com.bjsxt.factory;
public class CarFactory {
public static Car createCar(String type){
Car car=null;
if ("奔驰".equals(type)){
car=new BenChi();
}else if("宝马".equals(type)){
car=new BMW();
}
return car;
}
}
package com.bjsxt.factory;
public class CarFactory2 {
public static Car createBMW(){
return new BMW();
}
public static Car createBenChi(){
return new BenChi();
}
}

建造者模式


package com.bjsxt.clone;
import java.util.Date;
public class Sheep implements Cloneable {
private String name;
private Date birth;
@Override
protected Object clone() throws CloneNotSupportedException {
Object clone = super.clone();//直接调用object对象的clone方法
//添加如下代码实现深复制
Sheep s=(Sheep)clone;
s.birth=(Date) this.birth.clone();//将属性也进行克隆
return clone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Sheep(String name, Date birth) {
super();
this.name = name;
this.birth = birth;
}
}
package com.bjsxt.clone;
import java.util.Date;
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Date date=new Date();
Sheep sheep=new Sheep("first",date);
Sheep sheepClone = (Sheep) sheep.clone();
System.out.println(sheep);
System.out.println(sheep.getName());
System.out.println(sheep.getBirth());
date.setTime(1235498645132L);
System.out.println(sheep.getBirth());
sheepClone.setName("second");
System.out.println(sheepClone);
System.out.println(sheepClone.getName());
System.out.println(sheepClone.getBirth());
}
}
创建型模式的总结
设计模式GOF23(创建型模式)的更多相关文章
- Java设计模式之创建型模式
创建型模式分为五类:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 一.工厂方法模式:接口-实现类.工厂类
- GoF的23种设计模式之创建型模式的特点和分类
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”.这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成.就像我们去商场购买商品时, ...
- Typescript玩转设计模式 之 创建型模式
作者简介 joey 蚂蚁金服·数据体验技术团队 前言 我们团队的工作是用单页面应用的方式实现web工具.涉及到数万到十数万行的前端代码的管理,而且项目周期长达数年. 怎么样很好地管理好这种量级的前端代 ...
- Python与设计模式之创建型模式及实战
用Python学习一下设计模式,如果很枯燥的话,就强行能使用的就用一下.设计模式参考Python与设计模式-途索 1. 单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点. import ...
- 设计模式01 创建型模式 - 单例模式(Singleton Pattern)
参考 [1] 设计模式之:创建型设计模式(6种) | 博客园 [2] 单例模式的八种写法比较 | 博客园 单例模式(Singleton Pattern) 确保一个类有且仅有一个实例,并且为客户提供一 ...
- GoF23种设计模式之创建型模式之工厂方法模式
一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...
- GoF23种设计模式之创建型模式之抽象工厂模式
一.概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 二.适用性 1.一个系统要独立于它的产品的创建.组合和表示的时候. 2.一个系统要由多个产品系列中的一个来配置的时候. ...
- GoF23种设计模式之创建型模式之建造者模式
一.概述 将一个复杂对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示. 二.适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式的时候. 2.当构造过程必须允许 ...
- GoF23种设计模式之创建型模式之单态模式
1概述 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2适用性 1.当类只能有一个实例而且客户可以从一个总所周知的访问点访问它的时候. 2.当这个唯一实例应该是通过子类化可扩展的,并且客户应 ...
- GoF23种设计模式之创建型模式之原型模式
一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.适用性 1.当一个系统应该独立于它的产品创建.构成和表示的时候. 2.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...
随机推荐
- Docker基础与实战,看这一篇就够了
docker 基础 什么是Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Uni ...
- windows 10上源码编译dlib教程 | compile dlib on windows 10
本文首发于个人博客https://kezunlin.me/post/654a6d04/,欢迎阅读! compile dlib on windows 10 Series Part 1: compile ...
- PHP变量的初始化以及赋值方式介绍
什么是变量 变量通俗的来说是一种容器.根据变量类型不同,容器的大小不一样,自然能存放的数据大小也不相同.在变量中存放的数据,我们称之为变量值. PHP 中的变量用一个美元符号后面跟变量名来表示.变量名 ...
- ASP.NET Core gRPC 使用 Consul 服务注册发现
一. 前言 gRPC 在当前最常见的应用就是在微服务场景中,所以不可避免的会有服务注册与发现问题,我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心,本文主要介绍 ...
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等)
python3 解释器默认编码为Unicode,由str类型进行表示.二进制数据使用byte类型表示. 字符串通过编码转换成字节串,字节码通过解码成为字符串. encode:str-->byte ...
- Spring中常见的设计模式——单例模式
一.单例模式的应用场景 单例模式(singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点.J2EE中的ServletContext,ServletCon ...
- Spring与Redis整合(spring-data-redis)
maven依赖 <properties> <!-- redis 版本 --> <redis.version>2.9.0</redis.version> ...
- 常见 MIME 类型列表(转)
本文转自:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MI ...
- python网络爬虫之自动化测试工具selenium[二]
目录 前言 一.获取今日头条的评论信息(request请求获取json) 1.分析数据 2.获取数据 二.获取今日头条的评论信息(selenium请求获取) 1.分析数据 2.获取数据 房源案例(仅供 ...
- EntityFramework Core 3多次Include导致查询性能低之解决方案
前言 上述我们简单讲解了几个小问题,这节我们再来看看如标题EF Core中多次Include导致出现性能的问题,废话少说,直接开门见山. EntityFramework Core 3多次Include ...