做网站的技术要求,怎么在百度上做网站推广,网站重新安装,花都区建设局网站创建型模式
单例模式#xff08;Singleton Pattern#xff09;
单例模式#xff08;Singleton Pattern#xff09;在Java中的使用场景与在其他编程语言中类似#xff0c;其主要目的是确保一个类只有一个实例#xff0c;并提供一个全局的访问点。以下是单例模式的一些常…创建型模式
单例模式Singleton Pattern
单例模式Singleton Pattern在Java中的使用场景与在其他编程语言中类似其主要目的是确保一个类只有一个实例并提供一个全局的访问点。以下是单例模式的一些常见使用场景及详细讲解
使用场景 控制资源的使用 数据库连接池数据库连接是昂贵的资源使用单例模式可以确保只有一个连接池实例统一管理连接资源避免重复创建和销毁连接提高系统性能。线程池线程的创建和销毁开销较大单例模式可以确保只有一个线程池实例集中管理线程提高系统效率。 全局配置管理 配置文件管理系统中的配置通常是全局的使用单例模式可以确保配置文件只被加载一次并且全局共享避免多次加载造成的资源浪费。日志管理器日志系统在应用程序中通常是全局的通过单例模式可以确保日志管理器实例的唯一性方便统一管理日志输出。 状态管理 缓存管理在某些系统中需要对一些数据进行缓存使用单例模式可以确保缓存管理器实例的唯一性从而保证缓存的一致性和统一管理。设备管理对于一些物理设备如打印机或串口设备通过单例模式可以确保设备管理器的唯一实例避免设备被多个对象同时操作。
实现示例Java
下面是一个在Java中实现单例模式的示例
饿汉式单例模式
饿汉式单例模式在类加载时就创建实例
public class Singleton {// 在类加载时创建实例private static final Singleton INSTANCE new Singleton();// 私有化构造函数防止外部实例化private Singleton() {}// 提供一个公共的访问方法public static Singleton getInstance() {return INSTANCE;}
}懒汉式单例模式
懒汉式单例模式在需要时才创建实例
public class Singleton {// 初始时不创建实例private static Singleton instance;// 私有化构造函数防止外部实例化private Singleton() {}// 提供一个公共的访问方法并使用 synchronized 关键字确保线程安全public static synchronized Singleton getInstance() {if (instance null) {instance new Singleton();}return instance;}
}双重检查锁定Double-Checked Locking
这种方式通过双重检查加锁确保线程安全并提高效率
public class Singleton {// 使用 volatile 关键字确保多线程环境下变量的可见性private static volatile Singleton instance;// 私有化构造函数防止外部实例化private Singleton() {}// 提供一个公共的访问方法public static Singleton getInstance() {if (instance null) {synchronized (Singleton.class) {if (instance null) {instance new Singleton();}}}return instance;}
}使用示例
public class Main {public static void main(String[] args) {Singleton singleton1 Singleton.getInstance();Singleton singleton2 Singleton.getInstance();singleton1.value 42;System.out.println(singleton2.value); // 输出 42证明两个引用指向同一个实例}
}通过上述示例可以看出无论是饿汉式、懒汉式还是双重检查锁定单例模式都可以确保一个类只有一个实例并在需要时提供全局访问点。这在实际应用中有助于资源管理、状态管理和配置管理等。
建造者模式Builder Pattern
建造者模式Builder Pattern是一种创建型设计模式它允许你分步骤创建复杂对象。通过将一个复杂对象的构造代码从其表示中分离出来建造者模式可以让你通过细化各个部分的构造步骤来创建一个复杂对象。
适用场景 需要生成的对象有复杂的内部结构 对象的创建过程包含多个步骤或多个部件的创建。 同样的创建过程需要生成不同的表示 一个构建过程可以创建多个不同类型的对象。 客户端代码不希望直接控制对象的创建过程 客户端代码只需要一个构建器来控制创建的细节。
实现示例Java
以下是一个简单的建造者模式的实现示例展示如何创建不同类型的房子如石头房子和木头房子。
1. 产品类
public class House {private String foundation;private String structure;private String roof;private String interior;public void setFoundation(String foundation) {this.foundation foundation;}public void setStructure(String structure) {this.structure structure;}public void setRoof(String roof) {this.roof roof;}public void setInterior(String interior) {this.interior interior;}Overridepublic String toString() {return House [foundation foundation , structure structure , roof roof , interior interior ];}
}2. 抽象建造者类
public abstract class HouseBuilder {protected House house;public House getHouse() {return house;}public void createNewHouse() {house new House();}public abstract void buildFoundation();public abstract void buildStructure();public abstract void buildRoof();public abstract void buildInterior();
}3. 具体建造者类
public class StoneHouseBuilder extends HouseBuilder {Overridepublic void buildFoundation() {house.setFoundation(Stone foundation);}Overridepublic void buildStructure() {house.setStructure(Stone walls);}Overridepublic void buildRoof() {house.setRoof(Stone roof);}Overridepublic void buildInterior() {house.setInterior(Stone interior);}
}public class WoodenHouseBuilder extends HouseBuilder {Overridepublic void buildFoundation() {house.setFoundation(Wooden foundation);}Overridepublic void buildStructure() {house.setStructure(Wooden walls);}Overridepublic void buildRoof() {house.setRoof(Wooden roof);}Overridepublic void buildInterior() {house.setInterior(Wooden interior);}
}4. 指挥者类
public class Director {private HouseBuilder houseBuilder;public void setHouseBuilder(HouseBuilder houseBuilder) {this.houseBuilder houseBuilder;}public House getHouse() {return houseBuilder.getHouse();}public void constructHouse() {houseBuilder.createNewHouse();houseBuilder.buildFoundation();houseBuilder.buildStructure();houseBuilder.buildRoof();houseBuilder.buildInterior();}
}5. 客户端代码
public class Client {public static void main(String[] args) {Director director new Director();// 建造石头房子HouseBuilder stoneHouseBuilder new StoneHouseBuilder();director.setHouseBuilder(stoneHouseBuilder);director.constructHouse();House stoneHouse director.getHouse();System.out.println(House built:\n stoneHouse);// 建造木头房子HouseBuilder woodenHouseBuilder new WoodenHouseBuilder();director.setHouseBuilder(woodenHouseBuilder);director.constructHouse();House woodenHouse director.getHouse();System.out.println(House built:\n woodenHouse);}
}注释说明 产品类 House 类表示一个复杂对象。它有多个部件如基础、结构、屋顶和内部装饰。 抽象建造者类 HouseBuilder 是一个抽象类定义了构建 House 对象的各个步骤如 buildFoundation、buildStructure 等。 具体建造者类 StoneHouseBuilder 和 WoodenHouseBuilder 是具体的建造者类实现了抽象建造者类的方法具体定义了如何构建 House 的各个部件。 指挥者类 Director 类负责管理建造过程。它通过调用 HouseBuilder 的方法来一步步构建 House 对象。 客户端代码 Client 类通过 Director 类来构建不同类型的房子。客户端代码不需要直接控制对象的创建过程只需要使用 Director 来管理建造者。
总结
建造者模式通过将复杂对象的构建过程分离出来使得客户端代码可以灵活地构建不同类型的对象。它适用于需要构建复杂对象的场景尤其是当对象的创建过程包含多个步骤或多个部件时。建造者模式可以提高代码的可读性和可维护性。
原型模式Prototype Pattern
原型模式Prototype Pattern是一种创建型设计模式它允许一个对象通过克隆自身来创建新的对象。使用原型模式可以避免创建对象时涉及复杂的初始化步骤同时也可以方便地复制已有对象的状态。
适用场景 对象的创建成本很高 当对象的创建成本很高且可以通过复制来减少成本时可以使用原型模式。 对象的初始化复杂 对象的初始化需要很多步骤而这些步骤又可能会有所变化使用原型模式可以简化这些步骤。 需要大量相似对象 当需要大量相似对象时可以通过复制原型来快速创建新对象。
实现示例Java
以下是一个简单的原型模式的实现示例展示如何克隆不同类型的形状如圆形和矩形。
1. 定义原型接口
public interface Shape extends Cloneable {Shape clone();void draw();
}2. 具体原型类实现接口
public class Circle implements Shape {private int radius;public Circle(int radius) {this.radius radius;}Overridepublic Circle clone() {return new Circle(this.radius);}Overridepublic void draw() {System.out.println(Drawing a circle with radius: radius);}
}public class Rectangle implements Shape {private int width;private int height;public Rectangle(int width, int height) {this.width width;this.height height;}Overridepublic Rectangle clone() {return new Rectangle(this.width, this.height);}Overridepublic void draw() {System.out.println(Drawing a rectangle with width: width and height: height);}
}3. 客户端代码
public class Client {public static void main(String[] args) {// 创建原型对象Circle originalCircle new Circle(5);Rectangle originalRectangle new Rectangle(3, 4);// 克隆对象Circle clonedCircle originalCircle.clone();Rectangle clonedRectangle originalRectangle.clone();// 使用克隆对象originalCircle.draw();clonedCircle.draw();originalRectangle.draw();clonedRectangle.draw();}
}注释说明 原型接口 Shape 接口继承了 Cloneable 接口并定义了 clone 和 draw 方法。clone 方法用于克隆对象draw 方法用于绘制形状。 具体原型类 Circle 和 Rectangle 类实现了 Shape 接口并提供了自己的 clone 和 draw 方法。clone 方法使用当前对象的状态创建一个新对象。 客户端代码 Client 类创建了原型对象如 Circle 和 Rectangle然后通过调用 clone 方法克隆这些对象并使用克隆的对象。
总结
原型模式通过克隆现有对象来创建新对象适用于对象创建成本高、初始化复杂或需要大量相似对象的场景。它能够简化对象创建过程提高代码的灵活性和可维护性。