设计模式-创建型模式(单例、简工、工方)
1.单例模式
确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建模式。
1.1 饿汉式单例类
当类被加载时,静态变量instance被初始化,此时类的私有构造函数会被调用,单例类的唯一实例将被创建。但是不管用不用得到,这个实例都被创建,占用内存空间。
对应的Java片段:
class EagerSingleton{private static final EagerSingleton instance = new EagerSIngleton();private EagerSingleton() {}public static EagerSingleton getInstance(){return instance}
}
1.2 懒汉式单例类
带有双重检查锁定(Double-Check Locking)的懒汉式单例类。
对应的Java片段:
class LazySingleton{private volatile static LazySingleton instance = null;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null){synchronized (LazySingleton.class) {if (instance == null) {instance = new LazySingleton();}}}return instance;}
}
1.3 IoDH单例
结合前两种单例模式的优点。在实现IoDH时,需要在单例类中增加一个静态内部类,在该内部类中创建单例对象,再将该单例对象通过getInstance方法返回给外部使用。
对应的Java片段:
class Singleton{private Singleton() {}private static class HolderClass {private final static Singleton instance = new SIngleton();}private static Singleton getInstance() {return HolderClass.instance;}public class void main(String args[]) {Singleton s1, s2;s1 = Singleton.getInstance();s2 = Singleton.getInstance();System.out.println(s1 == s2);}
}
结果必定是true。单例模式的适用场景:系统只需要一个实例对象;客户调用类的单个实例只允许适用一个公共访问点。
2.简单工厂模式
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此又称为静态工厂模式,属于类创建型模式。
工厂模式结构:
(1)Factory(工厂角色):即工厂类,模式的核心,负责创建所有产品实例的内部逻辑。工厂类可直接被外界调用,创建所需的产品对象。在类中提供了静态工厂方法factoryMethod(),返回类型为产品类型Product。
(2)Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法。
(3)ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每个具体产品角色都继承了抽象产品角色Product,需要实现在抽象产品中声明的抽象方法。
对应的Java片段:
abstract class Product {//调用所有产品类的公共业务方法public void methodSame(){//公共方法的实现 }//声明抽象业务方法public abstract void methodDiff();
}class ConcreateProduct extends Product{//实现业务方法public void methodDiff(){//业务方法的实现}
}class Factory{//静态工厂方法public static Product getProduct(String arg){Product product = null;if(arg.equalslgnoreCase("A")){product = new ConcreateProductA();} else if(arg.equalslgnoreCase("B")){product = new ConcreateProductB();}return product}
}//客户端代码调用
class Client{public static void main(String arg){Product product;product = Factory.getFactory("A");product.methodSame(); product.methodDiff();}
}
3.工厂方法模式
定义一个用于创建对象的接口,让子类决定将那一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又称为工厂模式、虚拟构造器模式、多态工厂模式。
工厂方法模式结构:
在工厂模式结构图中包含以下4个角色:
(1)Product(抽象产品):它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。
(2)ConcreteProduct(具体产品):它实现了冲徐昂产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间意义对应。
(3)Factory(抽象工厂):在抽象工厂类中,声明了工厂方法(Factory Method),用于返回同一个产品。抽象工厂是工厂方法模型的核心,所有创建对象的工厂类都必须实现该接口。
(4)ConcreteFactory(具体工厂):它是抽象工厂类的子类,实现了抽象工厂类中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
代码参考:https://github.com/Onecat-j/JavaProjects
设计模式-创建型模式(单例、简工、工方)相关推荐
- 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)
七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...
- 设计模式-创建型模式-抽象工厂模式
工程源码:设计模式-创建型模式-抽象工厂模式https://download.csdn.net/download/qq_40788199/85544119 码云:设计模式-创建型模式-抽象工厂模式ht ...
- 设计模式-创建型模式-工厂方法模式
工程源码:c++设计模式-创建型模式-工厂方法模式https://download.csdn.net/download/qq_40788199/85541617 码云:https://gitee.co ...
- 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript
设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...
- 设计模式-创建型模式-建造者模式
设计模式-创建型模式-建造者模式 建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 代码如下 // 产品类 public class Product{pu ...
- 设计模式-创建型模式-模板方法
设计模式-创建型模式-模板方法 定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义一个算法的步骤. protected 对于本包及其子类可见. 类图 代码 代 ...
- 设计模式-创建型模式-工厂模式(工厂三兄弟)
设计模式-创建型模式-工厂模式(工厂三兄弟) 工厂模式分为简单工厂,工厂方法,抽象工厂. 简单工厂模式 一个接口,三个具体类,一个工厂,通过选择,生产出对应的对象. package demo2;pub ...
- 设计模式-创建型模式-简单工厂模式
工程地址:设计模式-简单工厂源码-C++文档类资源-CSDN下载C++设计模式-创建型模式-简单工厂模式源码更多下载资源.学习资料请访问CSDN下载频道.https://download.csdn.n ...
- 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。
设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...
最新文章
- 常考数据结构与算法:删除链表的倒数第n个节点
- 《剑指offer》c++版本 6.从尾到头打印链表
- MyEclipse优化浅析
- TCP/IP协议学习
- Property #39;sqlSessionFactory#39; or #39;sqlSessionTemplate#39; are required
- MySQL 高级- case结构
- SAP Spartacus HTML Tags 实现介绍
- jq-AJAX 初步了解
- Android跟web哪个好,比系统自带的WebView更好用 | AgentWeb
- 文字排版不在单调!可临摹的网页UI设计模板,轻松驾驭!
- Javascript预解析、代码执行
- vs编译调试遇到问题
- PHP获取每个订单下订单商品的数量
- 最速下降法python_python实现最速下降法
- cesium 经纬度绘制点_Cesium搜索经纬度并标点
- fgo7.27服务器维护,【FGO日服】维护通知(7/12)
- 计算机吴军科学家个人故事,吴军:阅读与写作50讲+吴军个人成长书单
- excel表格如何转换成word表格_Excel表格转换为Word表格?99%的人想不到这样做最简单!...
- JGJ254-2011 建筑施工竹脚手架安全技术规范 免费下载
- CSAPP Lab2:Bomb Lab