Factory Method模式

Factory Method模式

父类定义接口,将实例创建生成过程交给交给子类,让子类决定创建产品

Product(产品)

Product角色属于框架这一方,是一个抽象类。它在Factory Method模式中生成实例所持有的接口(API), 但具体的处理则由子类ConcreteProduct角色决定。

Creator(创建者)

负责生成Product角色的抽象类,但具体的处理则由ConcreteCreator角色决定。在示例程序中,由Factory类扮演此角色。

ConcreteProduct(具体的产品)

属于加工这一方,它决定了具体的产品。在示例程序中,由IDCard类扮演此角色。

ConcreteCreator(具体的创建者)

ConcreteCreator角色属于加工者这一方,它负责生成具体的产品。在示例程序中,由IDCardFactory类扮演此角色。

Factory Method模式_第1张图片

类的一览表

名字 说明
framework Product 只定义抽象方法use的抽象类
framework Factory 实现了create方法的抽象类
idcard IDCard 实现了use方法的类
idcard IDCardFactory 实现了createProduct、registerProduct方法的类
Main 测试程序行为

Factory Method模式_第2张图片

package framework

Factory.java

package framework;

public abstract class Factory {

    protected abstract Product createProduct(String owner);

    protected abstract void registerProduct(Product product);


    public  final Product create(String owner){
        Product p = createProduct(owner);
        registerProduct(p);

        return p;
    }

}

Product.java

package framework;

public abstract class Product {
    public abstract void use();
}

package idcard

IDCard.java

package idcard;

import framework.Product;

public class IDCard extends Product {
    private String owner;
    public IDCard(String owner) {
        System.out.println("制作"+owner+"的ID卡");
        this.owner = owner;
    }

    public void use(){
        System.out.println("使用"+owner+"的ID卡");
    }

    public String getOwner(){
        return owner;
    }

}

IDCardFactory .java

package idcard;

import framework.Factory;
import framework.Product;

import java.util.ArrayList;
import java.util.List;

public class IDCardFactory extends Factory {

    private List owners = new ArrayList();



    protected Product createProduct(String owner) {
        return new IDCard(owner);
    }


    protected  void registerProduct(Product product) {
        owners.add(((IDCard) product).getOwner());
    }

    public List getOwners(){
        return owners;
    }

}

Main.java

import framework.Factory;
import framework.Product;
import idcard.IDCardFactory;

public class Main {
    public static void main(String[] args) {
        Factory factory = new IDCardFactory();
        Product card1 =factory.create("小明");
        Product card2 = factory.create("小红");
        Product card3 = factory.create("小刚");

        card1.use();
        card2.use();
        card3.use();
    }
}

总结,工厂模式遵循了依赖倒置原则

Factory Method模式_第3张图片

访问权限:

默认default访问的权限是Package,表示IDCard只能由IDCardFactory创建,不能由其它包中类创建。

Factory Method模式_第4张图片

Factory Method模式_第5张图片

构造方法必须实现,如果父类中定义了构造方法,则子类中必须使用super关键字, 先给父类变量赋值。

构造方法不能加abstract关键字

你可能感兴趣的:(Factory Method模式)