设计模式笔记3-工厂方法模式

3.工厂方法模式

        简单工厂模式的主要考虑的是对产品种类的扩展,能让产品种类的扩展变得容易。现在如果生产产品的工厂划分了地域(如BJFactory,TJFactory),那么原有的方法实现此目标还合适吗?不合适的话,该如何改进?(不考虑Order的增长)

3.1简单工厂模式

思路

在原来的SimpleFactory类的位置直接分成BJFactory与TJFactory两个类

UML类图

         可以看到,在增加新的工厂后,每次都需要在Order中聚合新的工厂。而每次增加新种类时,又必须在工厂中进行修改,由于工厂都是直接聚合在Order类中,所以很可能会导致Order类出现问题。为了降低耦合性,可以使用工厂方法模式。

3.2工厂方法模式

思路

可以将创建一个抽象的工厂类,让具体的工厂类去现象抽象的工厂。

UML类图

         这样做可以让降低程序的耦合性,Order类在使用Factory的方法时,在Factory中不会生产面包,而是交给Factory的子类,让子类完成生产面包的过程。无论以后再新建什么样的工厂,只要工厂继承了Factory抽象类即可,不会影响到Order。

代码

//Bread.java
public abstract class Bread {
    protected String type;

    //用于给设置type的值
    public void setType(String type) {
        this.type = type;
    }

    //准备面包材料
    public void prepare() {
        System.out.println("正在准备" + type + "面包的材料");
    }

    //烘焙面包
    public void bake() {
        System.out.println(type + "正在烘焙中");
    }

    //打包面包
    public void pack() {
        System.out.println(type + "正在打包中");
    }
}

class BJButterBread extends Bread {
}
class BJToast extends Bread {
}
class TJButterBread extends Bread {
}
class TJToast extends Bread {
}


//Factory.java
//抽象的工厂Factory类
public abstract class Factory {
    //创建生产面包的create方法
    protected abstract Bread createBread(String type);

    public void orderBread() {

        while (true) {

            //调用函数生产面包
            Bread bread = createBread(getType());

            //输出面包的订购过程
            if (bread != null) {
                bread.prepare();
                bread.bake();
                bread.pack();
                System.out.println("----------------------------");
            } else {
                System.out.println("订购失败");
                break;
            }
        }
    }

    //可以获取客户希望订购的面包种类,就是从控制台上获取输入数据
    private String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input Bread 种类:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

//BJFactory.java
public class BJFactory extends Factory {
    @Override
    protected Bread createBread(String type) {
        Bread bread = null;
        if ("ButterBread".equalsIgnoreCase(type)) {
            bread = new BJButterBread();
            bread.setType("BJButterBread");
        } else if ("Toast".equalsIgnoreCase(type)) {
            bread = new BJButterBread();
            bread.setType("BJToast");
        }
        return bread;
    }
}

//TJFactory.java
public class TJFactory extends Factory {
    @Override
    protected Bread createBread(String type) {
        Bread bread = null;
        if ("ButterBread".equalsIgnoreCase(type)) {
            bread = new TJButterBread();
            bread.setType("TJButterBread");
        } else if ("Toast".equalsIgnoreCase(type)) {
            bread = new TJButterBread();
            bread.setType("TJToast");
        }
        return bread;
    }
}

//Order.java
public class Order {
    static Factory factory;
    public static void main(String[] args) {
        String address = getType();
        //根据用户地点去相应的工厂制作面包
        if ("BJ".equalsIgnoreCase(address)) {
            factory = new BJFactory();
        } else if ("TJ".equalsIgnoreCase(address)) {
            factory = new TJFactory();
        }
        if (factory != null) {
            factory.orderBread();
        }
    }
    
    //可以获取客户的地点信息,就是从控制台上获取输入数据
    private static String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input Address:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值