工厂模式-1

  现在想象开了个包子店,就叫“呀买点包子店”,店里接单的流程是:接定单--准备食材--蒸包子--包装
进而生成了包子对象。如果从订单开始,正常的做法是这样:
public class BaoziStore {
	public Baozi orderBaozi(String type){
		Baozi baozi = null;
		if("pork".equals(type)){
			baozi = new PorkBaozi();
		}else if("beef".equals(type)){
			baozi = new BeefBaozi();
		}else if("大韭菜".equals(type)){
			baozi = new EggBaozi();
		}else{
			throw new RuntimeException("我们还没有上架这种包子!");
		}
		baozi.prepare();
		baozi.steam();
		baozi.box();
		return baozi;
	}
}

  

  从代码就能看出来下订单时的一坨恶心的代码,传入参数进而有着N多的判断,看着就很不爽的同时,让代码维护起来非常麻烦。
很容易想到的就是,包子馅是非常可能变化的。如果这个包子店要推出个芥末辣条馅,就会对方法代码进行修改,或者想要取消掉某个馅,同样要进行删除代码操作。
那么,这样的一个包子店就是个依赖性很强的包子店。他的所有对象都由他自己生成,这能不累么。因为对于每种包子具体实现的改变都会影响包子店。
所以我们说 BaoziStore 依赖于 包子的实现
 
我们设计的原则就是要 : 依赖抽象,不要依赖具体类。
 
  所以,让我们逐渐去优化这段代码。
 
一、首先使用封装,封装可能会改变的部分。
从代码中可以看出,会经常变化的就是下定单的部分,也就是说包子的种类可能会随时间的变化而变化。而制作包子的过程变化几率非常的小,可以忽略。那么我们就可以开始搞了!
 
public class BaoziStore {
	public Baozi orderBaozi(String type){
		Baozi baozi = null;
      //创建个对象,把原来的代码抽离,放入这个对象中。这个对象只管创建包子对象。
		baozi.prepare();
		baozi.steam();
		baozi.box();
		return baozi;
	}
}
    

  

上面的注释已经说明了思路。那么这个只用来创建包子的对象,我们可以称他为包子工厂。
那么有了包子工厂,只要需要创建包子对象的时候让工厂创建就可以了。代码如下:
 
public class SimpleBaoziFactory {
	public Baozi createBaozi(String type){
		Baozi baozi = null;
		if("pork".equals(type)){
			baozi = new PorkBaozi();
		}else if("beef".equals(type)){
			baozi = new BeefBaozi();
		}else if("egg".equals(type)){
			baozi = new EggBaozi();
		}else{
			throw new RuntimeException("没有这种类型的包子!");
		}
		return baozi;
	}
}

  

  那么刚才注释部分就可以使用这个新写的方法了。看起来我们只是把代码从一个地方搬到另一个地方,这么做是更繁琐了么?当然不是。有了包子工厂,不光我们这个包子店,其他的随便哪个店或者代理,只要需要做包子,那么就可以调用工厂来创建包子。进而达到复用代码。一旦创建包子需要修改,我们不用去挨家挨户的店去修改,只要改工厂方法就好了。
 
  通常,我们工厂的创建对象方法是写成静态的。这样就可以避免创建工厂对象。但是同时,我们也不可以通过继承来改变创建对象的行为了。
 
  以上的做法,称为简单工厂,他其实不是一个设计模式,而是一种编程习惯。从简单工厂,来推衍出--工厂模式
 

posted @ 2017-11-17 11:00  BlueK  阅读(157)  评论(0编辑  收藏  举报