工厂模式:创建对象的工厂
为什么要用工厂模式:
1,解耦
通过工厂模式可以把对象的创建和使用过程分离。
2,减少代码量,易于维护
如果我们直接new一个对象时,如果需要的对象构造方法比较复杂,那么可能需要一连串的代码去创建对象,如果在别的类中又需要创建该对象,那么代码的重复度肯定不小。通过工厂模式的话,我们把对象创建的具体逻辑给隐藏起来了,交给工厂统一管理,这样不仅减少了代码量,以后如果想改代码的话,只需要改一处即可,也方便我们日常的维护。
假如说,这个工厂现在用来生成蛋糕,下面先来看三个问题(弄懂这三个问题工厂模式翻篇)
1,任意定制蛋糕口味
2,任意定制蛋糕口味生产过程
3,任意定制蛋糕产品一族
一,我们先看第一个问题(任意定制蛋糕口味)
首先要有蛋糕的父类或者接口
package com.zl.factory; public interface Cake { void eat(); }
其次是具体的实现类
package com.zl.factory; //巧克力口味蛋糕 public class ChocolateCake implements Cake { @Override public void eat() { System.out.println("eat chocolateCake........"); } }
package com.zl.factory; //水果味蛋糕 public class FruitCake implements Cake { @Override public void eat() { System.out.println("eat fruitCake.........."); } }
最后就是运用到具体环境中,这里以测试类代替
package com.zl.factory; public class Test { public static void main(String[] args) { //定制水果味蛋糕 Cake cake = new FruitCake(); cake.eat(); } }
其实第一个问题就是Java多态
二,下面来第二个问题(任意定制蛋糕口味生产过程)
还是一样,先来几个具体的不同口味蛋糕
package com.zl.factory; //水果味蛋糕 public class FruitCake{ public void eat() { System.out.println("eat fruitCake.........."); } }
package com.zl.factory; //巧克力口味蛋糕 public class ChocolateCake { public void eat() { System.out.println("eat chocolateCake........"); } }
来一个蛋糕厂
package com.zl.factory; public class SimpleCakeFactory { public FruitCake createFruitCake(){ //before processing前置业务,如日志记录 return new FruitCake(); } public ChocolateCake createChocolateCake(){ //before processing前置业务,如日志记录 return new ChocolateCake(); } }
最后运用到具体环境中,还是以测试类代替
package com.zl.factory; public class Test { public static void main(String[] args) { //生产水果蛋糕 FruitCake fruitCake = new SimpleCakeFactory().createFruitCake(); fruitCake.eat(); //生产巧克力蛋糕 ChocolateCake chocolateCake = new SimpleCakeFactory().createChocolateCake(); chocolateCake.eat(); } }
这种也就是我们说的简单工厂,不过这种工厂比较混乱,什么蛋糕都生产,不专一
于是就有了我们说的工厂方法,为每一种口味蛋糕单一生产,废话少说,上代码
package com.zl.factory; public class FruitCakeFactory { public FruitCake create(){ //before processing前置业务,如日志记录 return new FruitCake(); } }
package com.zl.factory; public class ChocolateCakeFactory { public ChocolateCake create(){ //before processing前置业务,如日志记录 return new ChocolateCake(); } }
三,最后一个问题(任意定制蛋糕产品一族)