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

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

一、示例程序
制作身份证卡(ID卡)
这里写图片描述

此程序中有两个包:
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();

    }

}

这里写图片描述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值