设计模式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.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...
随机推荐
- sublime3中运行python文件
sublime3中运行python文件 tools->build system->new build stystem 粘贴下面代码{"cmd":["pytho ...
- python模块——socket
实例一. server: #socket套接字(IP + 端口号)(qq,wechat 发送接收消息依靠socket模块),cs架构import socketserver = socket.socke ...
- U盘安装centos7 系统卡在 starting dracut initqueue hook
U盘安装centos7启动过程中出现: [ok] Reached target Basic System 或者 [ok] starting dracut initqueue hook 下面是我解决的过 ...
- C++中对C的扩展学习新增内容———面向对象(封装)
面向对象(封装) 1.对封装的理解: 1.封装就是把变量和函数放在一起统一表示某一个食物. class 2.给类内部的成员增加访问控制权限. 3.封装的语法就是class定义一个类. 2.给对象成员增 ...
- 【python测试开发栈】python基础语法大盘点
周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...
- nyoj 1364-治安管理 (INT_MAX)
1364-治安管理 内存限制:128MB 时间限制:3000ms 特判: No 通过数:6 提交数:6 难度:2 题目描述: SZ市是中国改革开放建立的经济特区,是中国改革开放的窗口,已发展为有一定影 ...
- java中的transient关键字详解
目录 1.何谓序列化? 2.为何要序列化? 3.序列化与transient的使用 4.java类中serialVersionUID作用 5.transient关键字小结 前言 说实话学了一段时间jav ...
- 使用Executor框架创建线程池
Executor框架 Executor类:在java.util.concurrent类中,是JDK并发包的核心类. ThreadPoolExecutor: 线程池. Excutors: 线程池工厂,通 ...
- Jmeter---第一天配置中文环境、安装jmeter插件
一:安装就不在赘述,百度有很多优秀的文章.接下来开始我自己的学习笔记 二:设置JMETER,切换中文环境. 首先打开jmeter的安装目录,找到bin文件目录中的jmeter.propertie 打开 ...
- jdbc-mysql测试例子和源码详解
目录 简介 什么是JDBC 几个重要的类 使用中的注意事项 使用例子 需求 工程环境 主要步骤 创建表 创建项目 引入依赖 编写jdbc.prperties 获得Connection对象 使用Conn ...