简单工厂模式学习
package com.factory; //产品接口 public interface Product { void craftwork(); //制作工艺 void type(); //产品特征 }
package com.factory; //鲜奶实现类 public class Creamery implements Product { @Override public void craftwork() { System.out.println("实现类制作工艺:牛奶+除菌=鲜奶"); } @Override public void type() { System.out.println("实现类产品特征:原味浓香"); } }
package com.factory; //酸奶实现类 public class Yoghourt implements Product { @Override public void craftwork() { System.out.println("实现类制作工艺:牛奶+酵母菌+糖=酸奶"); } @Override public void type() { System.out.println("实现类产品特征:酸甜可口"); } }
package com.factory; //自定义异常 public class BadException extends Exception { public BadException(String msg){ super(msg); } }
package com.factory; //静态工厂方法 public class StaticFactory { public static Product factory(String str) throws BadException{ if(str.equalsIgnoreCase("yoghourt")){ System.out.println("静态工厂:生产酸奶"); return new Yoghourt(); }else if(str.equalsIgnoreCase("creamery")){ System.out.println("静态工厂:生产鲜奶"); return new Creamery(); }else{ throw new BadException("没有该类型产品!"); } } }
测试代码:
package com.factory; //测试类 public class Test { public static void main(String[] args) { try { Product y = StaticFactory.factory("Yoghourt"); y.craftwork(); y.type(); Product c = StaticFactory.factory("Creamery"); c.craftwork(); c.type(); } catch (BadException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
执行结果:
静态工厂:生产酸奶
实现类制作工艺:牛奶+酵母菌+糖=酸奶
实现类产品特征:酸甜可口
静态工厂:生产鲜奶
实现类制作工艺:牛奶+除菌=鲜奶
实现类产品特征:原味浓香
总结:
1、静态工厂决定哪一个产品类应当被实例化
产品接口: 产品类1,产品类2,产品类3实现产品接口
工厂类:如果有新的产品类添加,添加判断逻辑,依据逻辑进行产品类的实例化
2、对开闭原则支持不够
要修改工厂类
工厂方法模式:
1、克服了简单工厂模式的缺点
2、工厂类不再负责所有的产品的创建,仅负责给出具体工厂子类必须实现的接口
3、不接触哪个产品应该被实例化,只给出具体工厂子类必须实现的接口
4、新增加产品的时候,不需要修改产品类和工厂接口类,只需要添加一个新的产品类,增加一个生产该产品的工厂即可
5、遵循开闭原则,对扩展开放,对修改关闭
package com.factorymethod; //产品工厂接口 public interface ProductFactory { Product factory(); }
package com.factorymethod; public class CreameryFactory implements ProductFactory { @Override public Product factory() { System.out.println("鲜奶工厂类:生产鲜奶"); return new Creamery(); } }
package com.factorymethod; public class YoghourtFactory implements ProductFactory { @Override public Product factory() { System.out.println("酸奶工厂类:生产酸奶"); return new Yoghourt(); } }
测试类:
package com.factorymethod; //测试类 public class Test { public static void main(String[] args) { Product y = new YoghourtFactory().factory(); y.craftwork(); y.type(); Product c = new CreameryFactory().factory(); c.craftwork(); c.type(); } }
执行结果:
酸奶工厂类:生产酸奶
实现类制作工艺:牛奶+酵母菌+糖=酸奶
实现类产品特征:酸甜可口
鲜奶工厂类:生产鲜奶
实现类制作工艺:牛奶+除菌=鲜奶
实现类产品特征:原味浓香