这类模式主要关注对象的创建过程。它们试图在创建对象的同时,将对象的创建和使用分离,以达到更高的灵活性和可扩展性.
//操作步骤一:定义一个动物类接口
public interface Animal {
void speak();
}
//操作步骤二:Cat实现动物类接口
public class Cat implements Animal {
@Override
public void speak() {
System.out.println("我是cat类,喵喵喵");
}
}
//操作步骤二:Dog实现动物类接口
public class Dog implements Animal {
@Override
public void speak() {
System.out.println("我是dog类,汪汪汪");
}
}
//操作步骤三:工厂类
public class AnimalFactory {
/**
* 创建一个动物,根据类型创建
* */
public static Animal createAnimal(String type){
if (type.equalsIgnoreCase("dog")) {
return new Dog();
} else if (type.equalsIgnoreCase("cat")) {
return new Cat();
} else {
throw new IllegalArgumentException("Invalid animal type");
}
}
}
//代码测试
public class FactoryTest {
/**
* 1.定义了一个Animal接口和两个实现该接口的类Dog和Cat。
* 2.创建了一个工厂类AnimalFactory,它有一个静态方法createAnimal,该方法根据传入的类型参数来创建相应的 动物对象。
* 3.在客户端代码中,我们使用工厂类来创建不同的动物对象并调用它们的speak方法。
*
* 这个例子展示了工厂模式的基本用法,通过工厂类来创建对象,而不是直接使用构造函数。
* 这样做的好处是可以将对象的创建逻辑与使用逻辑分离,使得代码更加灵活和可维护。
* */
public static void main(String[] args) {
Animal cat = AnimalFactory.createAnimal("cat");
cat.speak(); //创建一个cat类
Animal dog = AnimalFactory.createAnimal("dog");
dog.speak();
}
}
1.简单工厂模式2.工厂方法模式 3.抽象工厂模式
创建复杂对象:如果一个对象的创建过程非常复杂,需要很多步骤,工厂模式可以将这些步骤封装在工厂类中,简化客户端代码。
对象类型动态决定:如果需要在运行时根据不同的情况创建不同的对象,可以使用工厂模式。例如,根据用户输入的信息创建不同类型的图形对象。
依赖注入:在依赖注入的应用中,工厂模式可以用来创建所需的依赖对象,并将其注入到目标对象中。
多数据库支持:如果应用需要支持多种数据库,可以使用工厂模式来创建对应的数据库连接对象。
工具类创建:如果一个类无法轻易通过new直接创建(例如,由于某些原因需要隐藏其构造函数),可以提供一个静态工厂方法来创建该类的实例。
遵循开闭原则:工厂模式允许系统在不修改现有代码的情况下引入新的产品类,这有助于保持系统的灵活性和可扩展性。
配置文件加载:在读取配置文件并根据配置信息创建相应对象时,工厂模式非常有用。
多平台或多环境支持:针对不同的平台或环境可能需要创建不同的对象,工厂模式可以根据环境变量或平台特性来决定实例化哪个类。
游戏开发中的实体生成:在游戏开发中,不同的游戏实体(如角色、道具、敌人等)可以通过工厂模式来创建,便于管理和扩展。
10.框架和库的开发:在设计框架或库时,为了提供灵活的扩展点,通常会使用工厂模式来创建关键组件。
总体来说,工厂模式适用于那些对象创建过程复杂、需要隔离创建和使用、或者需要对创建过程进行集中管理的场景。
通过使用工厂模式,可以提高代码的模块化和可维护性,同时减少出错的可能性。
/**
* @author :jerry
* @date :Created in 2024/4/19 13:50
* @description:枚举实现单利模式
* @version: V1.1
*/
public enum SingletonEnum {
INSTANCE;
// 在枚举中定义实例变量和方法
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//代码测试
public static void main(String[] args) {
// 获取单例对象并设置名称
SingletonEnum singleton = SingletonEnum.INSTANCE;
singleton.setName("Singleton");
// 输出单例对象的名称
System.out.println(singleton.getName());
}
}
/**
* @author :jerry
* @date :Created in 2024/4/19 13:59
* @description:饿汉式(线程安全):
* @version: V1.1
*/
public class EagerSingleton {
//类加载时就创建实例
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
public static void main(String[] args) {
// 获取单例对象
EagerSingleton instanceObj = EagerSingleton.getInstance();
System.out.println("其他操作");
}
}
/**
* @author :jerry
* @date :Created in 2024/4/19 13:59
* @description:懒汉式(线程不安全):
* @version: V1.1
*/
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
//第一次使用时创建实例,实现了延迟加载
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
public static void main(String[] args) {
LazySingleton instanceObj = LazySingleton.getInstance();
System.out.println("其他操作");
}
}
/**
* @author :jerry
* @date :Created in 2024/4/19 14:16
* @description:双重检查锁定
* @version: V1.1
*/
public class SingletonDouble {
private static volatile SingletonDouble instance;
private SingletonDouble() {
}
public static SingletonDouble getInstance() {
if (instance == null) {
synchronized (SingletonDouble.class) {
if (instance == null) {
instance = new SingletonDouble();
}
}
}
return instance;
}
public static void main(String[] args) {
SingletonDouble instance = SingletonDouble.getInstance();
System.out.println("其他业务代码");
}
}
单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供该实例的全局访问点。
单例模式的核心思想是控制对象的创建,确保一个类在任何情况下都只有一个实例存在。这个唯一的实例可以通过特定的方法在整个应用程序中被访问。
单例模式可以节省系统资源,对于频繁使用的对象,避免多次创建和销毁;同时,它还提供了一个对资源的受控访问点,比如配置文件、线程池或数据库连接等。
总的来说,单例模式适用于那些需要频繁使用且不需要多个实例的场景,如配置管理、日志记录、驱动程序对象等。它可以减少系统开销,但同时也需要注意其可能带来的问题,如内存泄漏和过度使用导致的代码耦合。在实际使用中,应根据具体情况选择合适的实现方法,并注意单例的生命周期管理和访问控制。
//操作步骤一:抽象工厂
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
//操作步骤二:抽象产品A
public interface ProductA {
void operationA();
}
//操作步骤三:抽象产品B
public interface ProductB {
void operationB();
}
//操作步骤四:具体产品A1
public class ConcreteProductA1 implements ProductA {
@Override
public void operationA() {
System.out.println("ConcreteProductA1 operationA");
}
}
//操作步骤四:具体产品A2
public class ConcreteProductA2 implements ProductA {
@Override
public void operationA() {
System.out.println("ConcreteProductA2 operationA");
}
}
//操作步骤四:具体产品B1
public class ConcreteProductB1 implements ProductB {
@Override
public void operationB() {
System.out.println("ConcreteProductB1 operationB");
}
}
//操作步骤四:具体产品B2
public class ConcreteProductB2 implements ProductB {
@Override
public void operationB() {
System.out.println("ConcreteProductB2 operationB");
}
}
//操作步骤五:具体工厂1
public class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
//操作步骤五:具体工厂2
public class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
public class AbstractFactoryTest {
/**
*1.ProductA和ProductB是抽象产品接口,分别定义了各自的操作方法。
* ConcreteProductA1、ConcreteProductA2、ConcreteProductB1和
ConcreteProductB2是具体的产品类,实现了相应的抽象产品接口。
* 2.AbstractFactory是抽象工厂接口,定义了创建产品的方法。ConcreteFactory1和
ConcreteFactory2是具体的工厂类,实现了抽象工厂接口,并返回相应的具体产品对象。
* 在客户端代码中,通过调用不同的工厂对象的创建方法来获取不同类型的产品对象,并执行相应的操作
* */
public static void main(String[] args) {
AbstractFactory factory1 = new ConcreteFactory1();
ProductA productA1 = factory1.createProductA();
ProductB productB1 = factory1.createProductB();
productA1.operationA(); // 输出:ConcreteProductA1 operationA
productB1.operationB(); // 输出:ConcreteProductB1 operationB
AbstractFactory factory2 = new ConcreteFactory2();
ProductA productA2 = factory2.createProductA();
ProductB productB2 = factory2.createProductB();
productA2.operationA(); // 输出:ConcreteProductA2 operationA
productB2.operationB(); // 输出:ConcreteProductB2 operationB
}
}
抽象工厂模式是一种创建型设计模式,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。
在实际应用中,抽象工厂模式可以帮助我们实现高度模块化和可扩展的设计,例如在开发家具商店模拟器时,可以通过抽象工厂模式来创建不同类型的家具产品,如椅子、桌子等,而无需在客户端代码中指定具体的产品类型。
//操作步骤一:抽象建造者角色
public interface Builder {
void buildPartA();
void buildPartB();
}
//操作步骤二:产品角色
public class Product {
private String partA;
private String partB;
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
public void show() {
System.out.println("PartA: " + partA + ", PartB: " + partB);
}
}
//操作步骤三:指挥者角色
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.buildPartA();
builder.buildPartB();
}
public Product getResult() {
return ((ConcreteBuilder) builder).getResult();
}
}
//操作步骤四:具体建造者角色
public class ConcreteBuilder implements Builder {
private Product product = new Product();
public void buildPartA() {
product.setPartA("Part A");
}
public void buildPartB() {
product.setPartB("Part B");
}
public Product getResult() {
return product;
}
}
//测试代码
public class BuilderTest {
/**
*Product类代表了要创建的复杂对象,Builder接口定义了构建产品各个部分的抽象接口,
* ConcreteBuilder类实现了Builder接口并完成了产品的各个部分的构建
* ,而Director类则负责指挥ConcreteBuilder进行产品的构建。
*
*
* 客户端代码通过创建ConcreteBuilder和Director对象,并调用指挥者的construct方法来构建最终的产品。
* */
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();
Product product = director.getResult();
product.show();
}
}
建造者模式(Builder)是一种对象创建型设计模式,旨在将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
//操作步骤一:定义一个抽象原型类
public class Prototype implements Cloneable {
private String value;
public Prototype(String value) {
this.value = value;
}
// 覆盖clone方法
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
//测试代码
public class PrototypeTest {
/**
* Prototype类实现了Cloneable接口并覆盖了clone()方法。
*
* 在main方法中,我们创建了一个原始对象,并通过调用clone()方法得到了一个复制的对象。这样我们就实现了原型模式。
* */
public static void main(String[] args) throws CloneNotSupportedException {
Prototype prototype1 = new Prototype("Tom");
Prototype prototype2 = (Prototype) prototype1.clone();
System.out.println("prototype1: " + prototype1.getValue());
System.out.println("prototype2: " + prototype2.getValue());
}
}
原型模式是一种创建型设计模式,用于通过复制现有的实例来创建新的对象,而不是通过调用构造函数来新建对象。
原型模式的关键在于利用已有的实例作为模板来创建新的实例,这样可以在不知晓具体类的情况下生成新对象。这种模式适用于那些创建成本高或者需要重复使用相似对象的场合。以下是原型模式的一些关键点:
综上所述,原型模式提供了一种灵活且高效的方式来创建对象,尤其适合那些对象创建成本较高或者需要避免与原始对象共享状态的场景。在实际应用中,根据具体需求选择合适的克隆方法(深克隆或浅克隆)是实现原型模式的关键。