设计模式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.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...
随机推荐
- Android9.0 SystemUI 网络信号栏定制修改
前情提要 Android 8.1平台SystemUI 导航栏加载流程解析 9.0 改动点简要说明 1.新增 StatusBarMobileView 替代 SignalClusterView,用以控制信 ...
- java数组、字符串拼接
1. 数组实现拼接 int[] arr ={11,22,33,44,55,66}; System.out.print("["); for (int i = 0; i <arr ...
- 从 DevOps 到 Serverless:通过“不用做”的方式解决“如何更高效做”的问题
作者 | 徐进茂(罗离) JAVA 开发工程师 导读:近年来,Serverless 一词越来越热,它已经逐渐成为了一种新型的软件设计架构.和 DevOps 概念提倡的是通过一系列工具和自动化的技术来 ...
- 超简单解决linux音乐播放器乱码问题
问题 中文MP3的tag信息有些因为采用了GBK编码, 导致linux下的大多播放器(Rhythmbox, Audacious)无法正确识别而显示乱码. 如下图Audacious的乱码情况. 网上的常 ...
- MySQL数据库之MyISAM与InnoDB的区别
MySQL数据库之MyISAM与InnoDB的区别 从以下几个方面: 1.存储结构 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义 ...
- 【最新发布】最新Python学习路线,值得收藏
随着AI的发展,Python的薪资也在逐年增加,但是很多初学者会盲目乱学,连正确的学习路线都不清楚,踩很多坑,为此经过我多年开发经验以及对目前行业发展形式总结出一套最新python学习路线,帮助大家正 ...
- Python 面向对象-下篇
面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...
- pat 1002 A+B for Polynomials (25 分)
1002 A+B for Polynomials (25 分) This time, you are supposed to find A+B where A and B are two polyno ...
- libdispatch.dylib中dispatch_group的实现
semaphore和group都是libdispatch提供的基于信号量的同步机制,dispatch_group继承自dispatch_semaphore,使用libdispatch层的信号量算法.d ...
- 获取单列集合,双列集合,数组的Stream流对象以及简单操作
获取流对象 获取单列集合,双列集合,数组的流对象 单列集合获取流对象: 1.java.util.Collection接口中加入了default方法stream()获取流对象,因此其所有实现类均可通过此 ...