设计模式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.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...
随机推荐
- php charles 使用方法
php charles 使用方法 打开charles 点击help菜单点击local ip address 可以获取本地ip 手机上选择代理这个ip 端口8888 然后手机访问网页 charles会弹 ...
- C#索引器与数组的区别
1.索引器的索引值类型不限定为整数 2.索引器允许重载 3.索引器不是一个变量 4.索引器以函数签名方式this标识,而属性采用名称来标识,名称可以任意 5.索引器不能使用static来进行声明,属性 ...
- ASP.NET Core 1.0: API的输入参数
Web API是需要接受参数的,譬如,通常用于创建数据的POST method需要接受输入数据,而用于GET method也需要接受一些可选参数,譬如:为了性能起见,控制返回数据的数量是至关重要的. ...
- MyBatis直接执行sql语句mapper
<select id="queryBySql" resultType="HashMap"> <![CDATA[ ${sql} ]]> & ...
- C++中对C的扩展学习新增语法——强制类型转换
类型转换:主要进行指针类型转换,因为在C++中,不同类型指针不允许隐式转换,任何一个程序中如果出现了大量的类型转换,说明该程序不是太好的程序. 注意事项: 不同类型指针不允许隐式转换: void* 类 ...
- Arduino 基于 ESP8266 配置WIFI模块
Arduino 基于 ESP8266 配置WIFI模块 使用ESP8266作为服务器,使用浏览器访问该服务器,从而控制LED灯 选择 [文件]->[示例]->[ESP8266WIFI]-& ...
- Mybatis加入日志
*在mybatis-config.xml核心配置文件中加入如下设置,在configration中标签中加入 <!--打印日志,方便看输出SQL --> <settings> & ...
- java快速复习 一 基础语法
最近看很多算法书,比较不错的有不少都是java语言描述,所以用一天时间快速研究并整理java ,参考资料:java入门经典 Call this file "Example2.java&qu ...
- kali linux 2019.4设置为中文方法
就在前天,2019年11月26日,kali Linux官网发布了最新版本:Kali Linux 2019.4发行版,此版本和之前相比变动很大,系统界面.主题.壁纸都灿然一新. Kali Linux20 ...
- DBEntry.Net 简介
[尊重作者:本文转自:http://www.cnblogs.com/lephone/] 这是我设计的一个轻量级的 .Net ORM (Object Relational Mapping) 数据访问 ...