Java创造者模式,又称为工厂方法模式。它是指定义一个创建对象的接口,让子类决定实例化哪一个类。在工厂方法中,根据传入的参数决定实例化哪一个类的对象并返回该对象。
具体实现:
- 创建一个抽象的产品类(Product),包含产品名称和价格等属性,以及产品的构造方法和getter/setter方法。
- 创建具体的产品类(Concrete Product1、Concrete Product2),继承自产品类,实现各自的业务逻辑,同时提供各自的getter/setter方法。
- 创建一个抽象的工厂类(Creator),包含一个静态的createProduct方法,该方法返回一个产品类的实例对象。
- 创建具体的工厂类(Concrete Creator1、Concrete Creator2),继承自工厂类,实现各自的业务逻辑,同时提供各自的createProduct方法。
- 客户端调用工厂类的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; //强制类型转换后的对象不是单例对象。
*/
}
}