设计模式之创建型模式及其相应代码:工厂模式、抽象工厂模式、单例模式、原型模式

创建型设计模式

概述:主要用于创建对象的过程中,封装对象的实例化逻辑。它通过定义一个创建对象的公共接口,但允许子类决定要实例化的类是哪一个。
优势:可以将对象的实例化过程与客户端代码解耦,使客户端代码更加灵活、可扩展。

举例说明:此代码段为公共代码段

// 定义产品接口A
public interface ProductA {
    
    
    void operation();
}

// 实现具体产品A1
public class ConcreteProductA1 implements ProductA {
    
    
    @Override
    public void operation() {
    
    
        System.out.println("ConcreteProductA1 operation");
    }
}

// 实现具体产品A2
public class ConcreteProductA2 implements ProductA {
    
    
    @Override
    public void operation() {
    
    
        System.out.println("ConcreteProductA2 operation");
    }
}

// 定义产品接口B
public interface ProductB {
    
    
    void operation();
}

// 实现具体产品B1
public class ConcreteProductB1 implements ProductB {
    
    
    @Override
    public void operation() {
    
    
        System.out.println("ConcreteProductB1 operation");
    }
}

// 实现具体产品B2
public class ConcreteProductB2 implements ProductB {
    
    
    @Override
    public void operation() {
    
    
        System.out.println("ConcreteProductB2 operation");
    }
}

工厂模式

创建只生成特定产品的工厂

// 实现具体工厂1
public class ConcreteFactory1 implements AbstractFactory {
    
    
    @Override
    public ProductA createProductA() {
    
    
    	// 只生成产品A1
        return new ConcreteProductA1();
    }

    @Override
    public ProductB createProductB() {
    
    
    	// 只生成产品B1
        return new ConcreteProductB1();
    }
}

// 实现具体工厂2
public class ConcreteFactory2 implements AbstractFactory {
    
    
    @Override
    public ProductA createProductA() {
    
    
    	// 只生成产品A2
        return new ConcreteProductA2();
    }

    @Override
    public ProductB createProductB() {
    
    
    	// 只生成产品B2
        return new ConcreteProductB2();
    }
}

抽象工厂模式

抽象工厂,可以创建多个工厂

// 抽象工厂接口
public interface AbstractFactory {
    
    
	// 负责创建A1、B1产品的工厂
    ProductA createProductA();
    // 负责创建A2、B2产品的工厂
    ProductB createProductB();
}

最后运行工厂代码段

// 客户端代码
public class Client {
    
    
    public static void main(String[] args) {
    
    
    	// 创建多个工厂,以至于来生成特定工厂所支持的产品
        AbstractFactory factory1 = new ConcreteFactory1();
        AbstractFactory factory2 = new ConcreteFactory2();
        ProductA productA1 = factory1.createProductA();
        ProductB productB1 = factory1.createProductB();
        ProductA productA2 = factory2.createProductA();
        ProductB productB2 = factory2.createProductB();
        productA1.operation();
        productB1.operation();
        productA2.operation();
        productB2.operation();
    }
}

单例模式

保证一个类只有一个实例,并提供一个全局访问点来访问该实例,但是会出现线程安全(采用加锁方法解决)

public class Singleton {
    
    
    // 私有的静态成员变量,用于保存单例的实例
    private static Singleton instance;

    // 私有的构造函数,防止外部代码通过new关键字创建该类的实例
    private Singleton() {
    
    
    }

    // 公共的静态方法,用于获取单例的实例
    public static synchronized Singleton getInstance() {
    
    
        if (instance == null) {
    
    
            instance = new Singleton();
        }
        return instance;
    }

    // 其他业务逻辑方法
    public void someMethod() {
    
    
        System.out.println("Singleton's someMethod");
    }
}

// 调用单例模式的实例
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        // 输出 true,说明两个变量指向同一个实例
        System.out.println(singleton1 == singleton2); 
        singleton1.someMethod();
        singleton2.someMethod();
    }
}

原型模式

通过复制现有的对象来生成新的对象,而无需通过构造函数进行创建,原型模式允许根据需要进行修改

public class Prototype implements Cloneable {
    
    
    private String name;

    public Prototype(String name) {
    
    
        this.name = name;
    }

    public String getName() {
    
    
        return name;
    }
	
    @Override
    public Prototype clone() throws CloneNotSupportedException{
    
    
    	// 实现对象的浅拷贝
        return (Prototype) super.clone();
    }
}

// 使用原型模式
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Prototype prototype = new Prototype("Prototype");

        try {
    
    
            Prototype clone = prototype.clone();
            System.out.println(clone.getName()); // 输出 "Prototype"

            // 修改原型对象的属性值
            prototype.name = "Modified Prototype";
            System.out.println(prototype.getName()); // 输出 "Modified Prototype"
            System.out.println(clone.getName()); // 输出 "Prototype"
        } catch (CloneNotSupportedException e) {
    
    
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/cleverstronge/article/details/131870806