欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式(Java)—Factory Method模式

程序员文章站 2022-06-14 23:28:09
...

用Template Method模式来构建生成实例的工厂,这就是Factroy Method模式,在Factory Method模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体的处理全部交给子类负责,这样就可以将生成实例的框架和实际负责生成实例的类解耦。

一、示例程序
制作身份证卡(ID卡)
设计模式(Java)—Factory Method模式

此程序中有两个包:
1.生成实例的框架(framework包)
2.加工处理(idcard包)

注:开发对外公开的包时,将域名反着写是默认的包命名方式。

Producet类(framework包):

package Framework;

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

该类进声明use抽象方法,use方法的实现则被交给了Product类的子类负责。

Factory类(framework包):

package Framework;

public abstract class Factory {
    //模板方法
    public final Product create(String owner){
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
    }
    //抽象方法
    protected abstract Product createProduct(String owner);
    protected abstract void registerProduct(Product product);
}

IDCard类(idcard包):

package idcard;

import Framework.Product;

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

    @Override
    public void use() {
        // TODO Auto-generated method stub
        System.out.println("使用"+owner+"("+number+")"+"的ID卡");

    }

    public String getOwner(){
        return owner;
    }
    public int getNumber(){
        return number;
    }


}

注:为了能明显体现出与框架的分离,将这个类放在idcard包中,IDCard类是产品Product类的子类。

IDCardFactory类(idcard包中):

package idcard;

import java.util.HashMap;

import Framework.Factory;
import Framework.Product;

public class IDCardFactory extends Factory {
    private HashMap database = new HashMap();
    private int number = 100;

    @Override
    protected Product createProduct(String owner) {
        // TODO Auto-generated method stub
        return new IDCard(owner,number++);
    }

    @Override
    protected void registerProduct(Product product) {
        // TODO Auto-generated method stub
        IDCard idCard = (IDCard) product;
        database.put(new Integer(idCard.getNumber()),idCard.getOwner());

    }
    public HashMap getDatabase(){
        return database;
    }

}

注: createProduct方法用来生成实例,registerProduct方法将持有人保存在HashMap中。

Main类:

import Framework.Factory;
import Framework.Product;
import idcard.IDCardFactory;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Factory factory = new IDCardFactory();
        Product card1 = factory.create("小明");
        Product card2 = factory.create("小花");
        Product card3 = factory.create("小小");
        card1.use();
        card2.use();
        card3.use();

    }

}

设计模式(Java)—Factory Method模式

注:不用new关键字来生成实例,而是调用生成实例的专用方法来生成实例,这样可以防止父类与其他具体类耦合。