0
点赞
收藏
分享

微信扫一扫

Java设计模式-创造者模式

Java创造者模式,又称为工厂方法模式。它是指定义一个创建对象的接口,让子类决定实例化哪一个类。在工厂方法中,根据传入的参数决定实例化哪一个类的对象并返回该对象。

具体实现:

  1. 创建一个抽象的产品类(Product),包含产品名称和价格等属性,以及产品的构造方法和getter/setter方法。
  2. 创建具体的产品类(Concrete Product1、Concrete Product2),继承自产品类,实现各自的业务逻辑,同时提供各自的getter/setter方法。
  3. 创建一个抽象的工厂类(Creator),包含一个静态的createProduct方法,该方法返回一个产品类的实例对象。
  4. 创建具体的工厂类(Concrete Creator1、Concrete Creator2),继承自工厂类,实现各自的业务逻辑,同时提供各自的createProduct方法。
  5. 客户端调用工厂类的createProduct方法,传入相应的参数,即可得到对应的产品对象。

示例代码:

// 抽象产品类
public abstract class Product {
    protected String name;
    protected double price;
    
    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public double getPrice() {
        return price;
    }
    
    public void setPrice(double price) {
        this.price = price;
    }
}

// 具体产品类1
public class ConcreteProduct1 extends Product {
    public ConcreteProduct1(String name, double price) {
        super(name, price);
    }
    
    @Override
    public void show() {
        System.out.println("This is product A: " + name + ", price:" + price);
    }
}

// 具体产品类2
public class ConcreteProduct2 extends Product {
    public ConcreteProduct2(String name, double price) {
        super(name, price);
    }
    
    @Override
    public void show() {
        System.out.println("This is product B: " + name + ", price:" + price);
    }
}

// 抽象工厂类1(工厂方法)
public abstract class Creator1 {  					// 声明一个静态的工厂方法,用来创建具体的对象;而不需要明确指出是通过哪个具体类来创建对象。				// 这里用的是抽象的父类名,实际使用时可以换成具体的父类名。				// 此处用abstract修饰,因为此段代码是抽象的,只有具体的子类才能创建对象。				// 此段代码中的方法都是抽象的,没有具体实现的方法。				// 此段代码中的字段都是私有的,外界无法访问,符合封装性原则。				// 此段代码没有子类。
    protected abstract Product createProduct1();
}

// 具体工厂类1(单例模式)
public class ConcreteCreator1 extends Creator1 {
    private static ConcreteCreator1 instance = new ConcreteCreator1();

    private ConcreteCreator1() {}

    public static ConcreteCreator1 getInstance() {
        return instance;
    }

    @Override
    protected Product createProduct1() {
        return new ConcreteProduct1("productA",99.9);
    }
}

//客户端使用示例:
public class ClientTest {
    public static void main(String[] args) {
        Creator1 creator1 = ConcreteCreator1.getInstance();
        Product product = creator1.createProduct1();
        product.show(); //输出"This is product A: productA, price:99.9"
        /*
        也可以不使用getInstance()方法获取实例,直接通过new关键字创建对象。但是这样每次获取到的都是同一个对象,不符合单例模式的原则。

        ClientTest test = new ClientTest(); // 多态特性不能通过new关键字来实例化单例类。
        ConcreteCreator1 c1 = (ConcreteCreator1)test; //强制类型转换后的对象不是单例对象。
        */
    }
}

举报

相关推荐

0 条评论