4.工厂模式
1.工厂模式可以把对象的创建和使用分离出来,降低代码的耦合性。
(1)简单工厂模式
简单工厂可以实现对象的创建和对象的使用分离,由专门的工厂类负责对象的创建,缺点在于工厂类不够灵活,如果需要增加新的产品需要修改工厂类,而且产品较多时,工厂方法代码逻辑将会非常复杂。
package com.java.dp.factory; /** * @Author lizhilong * @create 2019/12/2 17:27 * @desc 生产线接口 */ public interface BuildLine { void build(); }
package com.java.dp.factory; /** * @Author lizhilong * @create 2019/12/2 17:30 * @desc 食品生产线 */ public class FoodLine implements BuildLine { @Override public void build() { System.out.println("-----------生产食品--------------"); } }
package com.java.dp.factory; /** * @Author lizhilong * @create 2019/12/2 17:28 * @desc 服装生产线 */ public class ClothesLine implements BuildLine { @Override public void build() { System.out.println("-----------生产衣服------------"); } }
package com.java.dp.factory; /** * @Author lizhilong * @create 2019/12/2 17:32 * @desc 对象工厂 */ public class SimpleFactory { public static BuildLine getFactory(String name) { if ("food".equals(name)) { return new FoodLine(); } if ("clothes".equals(name)) { return new ClothesLine(); } return null; } }
BuildLine foodLine = SimpleFactory.getFactory("food"); foodFactory.build(); BuildLine clothesLine = SimpleFactory.getFactory("clothes"); clothesFactory.build();
(2)工厂模式
工厂模式通过核心的工厂类来负责创建工厂,具体的产品由相应的工厂去实现,这样的做的好处是如果需要增加新的产品,只需要相应的工厂,创建新的核心工厂类即可,对原来的代码无需修改,只需要维护新代码即可。
实现是在简单工厂的基础上新增核心工厂接口和实现。
package com.java.dp.factory; /** * @Author lizhilong * @create 2019/12/2 18:03 * @desc 核心工厂接口 */ public interface Factory { BuildLine defineBuildLine(); }
package com.java.dp.factory; /** * @Author lizhilong * @create 2019/12/2 18:05 * @desc 服装的核心工厂 */ public class ClothesFactory implements Factory { @Override public BuildLine defineBuildLine() { return new ClothesLine(); } }
Spring Ioc 容器的实现原理就是工厂模式,下面的调用就是模仿IOC容器的实现原理
package com.java.dp.factory; import java.util.HashMap; import java.util.Map; /** * @Author lizhilong * @create 2019/12/2 17:34 * @desc */ public class FactoryMain { private static Map beanMap = new HashMap(); static { try { beanMap.put("food",Class.forName("com.java.dp.factory.FoodFactory").newInstance()); beanMap.put("clothse",Class.forName("com.java.dp.factory.ClothesFactory").newInstance()); }catch (Exception e){ e.printStackTrace(); } } public static void main(String[] args) { Factory foodFactory = (FoodFactory) beanMap.get("food"); foodFactory.defineBuildLine().build(); Factory clothseFactory = (Factory) beanMap.get("clothse"); clothseFactory.defineBuildLine().build(); } }
-----------生产食品-------------- -----------生产衣服------------