简单工厂模式设计 - 学习笔记

 

实现过程: 通过这种简单工厂方式,即可把所有生成 Output 对象的逻辑集中在 OutputFactory 工厂类中管理,而所有需要使用 Output 对象的类只需要与 Output 接口耦合,而不是与具体的实现类耦合.即使系统中有很多类使用了 Printer 对象,只要 OutputFactory 类的 getOutput 方法生成的 Output 对象是 BetterPrinter 对象,则它们全部都会改为使用 BetterPrinter 对象,而所有程序无须修改,只需要修改 OutputFactory 工厂类的 getOutput 方法实现即可

假设让 Computer 类组合一个 Printer 对象,如果有一天系统需要重构,需要使用 BetterPrinter 来代替 Printer,这就需要打开 Computer 类源代码进行修改.如果系统中只有一个 Computer 类组合了 Printer 还好,但如果系统中有 100 个类组合了 Printer,甚至 1000 个,10000 个......将意味着需要打开 100 个,1000 个,10000 个类进行修改,这是多大的工作量啊!

为了避免这个问题,工厂模式建议让 Computer 类组合一个 Output 类型的对象,将 Computer 类与 Printer 类完全分离.Computer 对象实际组合的是 Printer 对象还是 BetterPrinter 对象,对 Computer 而言完全透明.当 Printer 对象切换到 BetterPrinter 对象时,系统完全不受影响.下面是这个 Computer 类的定义代码:

 

/**
 * Computer组合一个打印机功能
 */
public class Computer {
    private Output output;

    public Computer(Output output){
        this.output = output;
    }

    // 定义一个模拟获取字符串输入的方法
    public void keyIn(String msg){
        output.getData(msg);
    }

    // 定义一个模拟打印的方法
    public void print(){
        output.out();
    }
}
/**
 * 打印机接口
 */
public interface Output {
    int MAX_CACHE_LINE = 10;
    void getData(String msg); // 获取字符串输入的抽象方法

    void out(); // 定义一个模拟打印的方法
}
/**
 * 演示output工厂来生产output对象
 */
public class outputFactory {
    public Output getOutput(){
        return new BetterPrinter();
    }

    /**
     * 程序入口
     */
    public static void main(String[] args) {
        outputFactory of = new outputFactory();
        Computer c = new Computer(of.getOutput());
        c.keyIn("java基础");
        c.keyIn("java基础");
        c.keyIn("java基础");
        c.keyIn("java基础");
        c.keyIn("java基础");
        c.keyIn("java基础");
        c.keyIn("java基础");
        c.print();
    }
}
/**
 * BetterPrinter打印设备
 */
public class BetterPrinter implements Output {
    private String[] printData = new String[MAX_CACHE_LINE * 2];
    // 用于记录当前需要打印的作业数
    private int dataNum = 0;

    public void out() {
        while (dataNum > 0) {
            System.out.println("高速打印机正在打印:" + printData[0]);
            // 把作业队列整体前移一位,并将剩下的作业减1
            System.arraycopy(printData,1,printData,0, --dataNum);
        }
    }

    public void getData(String msg) {
        if (dataNum >= MAX_CACHE_LINE * 2) {
            System.out.println("输出队列已满,添加失败");
        } else {
            // 把打印数据添加到队列里,已保存数据的数量加1
            printData[dataNum++] = msg;
        }

    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值