将实例的生成交给子类-Factory Method模式

180 阅读2分钟

1、引入

工厂模式,正如其名字所言,可以不断地生产特定的符合某种规范的产品。

  • 在父类中规范实例的生成方式
  • 在子类中对实例的实现进行具体处理

2、示例

2.1、父类框架

在父类中,定义了抽象类:生产产品的工厂和生产的产品

public abstract class Factory {
    public final Product create(String owner) {
        Product product = createProduct(owner);
        registerProduct(product);
        return product;
    }

    protected abstract Product createProduct(String owner);
    protected abstract void registerProduct(Product product);
}
public abstract class Product {
    public abstract void use();
}

之所以需要定义抽象工厂:规范生产流程,产品生产后必须进行登记

之所以定义抽象产品:规范产品功能,必须具有能够使用的特性

2.2、子类实现

在子类中,定义了生产card的工厂和具体的card产品,对父类抽象方法进行实现

public class CardFactory extends Factory {
    private List owners=new ArrayList<String>();
    @Override
    protected Product createProduct(String owner) {
        return new Card(owner);
    }

    @Override
    protected void registerProduct(Product product) {
        owners.add(((Card)product).getOwner());
    }

    public List getOwners() {
        return owners;
    }
}
public class Card extends Product {
    private String owner;

    public String getOwner() {
        return owner;
    }

    Card(String owner) {
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println("使用"+owner+"的card");
    }
}

2.3、测试

public class Main {
    public static void main(String[] args) {
        CardFactory cardFactory = new CardFactory();
        Product card1 = cardFactory.create("张三");
        Product card2 = cardFactory.create("李四");
        Product card3 = cardFactory.create("王五");
        
        card1.use();
        card2.use();
        card3.use();
    }
}

运行结果

image.png

3、tips

  • 在Factory类中create()方法用final修饰,表明了该方法是不可重写的,这是由工厂模式的性质决定的,只有生产流程固定,才能生产出符合标准的产品。
  • 在Card类中,构造函数并不是使用public修饰,这表明该构造函数外部不能调用,这是由工厂模式的性质决定的,只有经过工厂才能生成card,保证了"品控"
  • 在框架中,我们经常可以看到工厂模式,如:
\\工厂模式规范生产流程的特性有利于在不同条件下为使用者生产符合标准的产品,因此在框架中广泛使用
dataSourse= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);