目录:
- 什么是工厂模式
- 为什么要有工厂模式
- 如何实现一个工厂模式
什么是工厂模式
工厂模式实际上就是封装了创建对象细节,将创建对象的细节与实际业务分离,达到解耦的目的。
为什么要有工厂模式
1、封装变化:创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者透明。
2、代码复用:创建代码抽离到独立的工厂类之后可以复用。
3、隔离复杂性:封装复杂的创建逻辑,调用者无需了解如何创建对象。
4、控制复杂度:将创建代码抽离出来,让原本的函数或类职责更单一,代码更简洁。
如何实现一个工厂模式
工厂模式有两类,工厂方法和抽象工厂。
1、工厂模式-简单工厂:
1 public interface IFruit { 2 3 /** 4 * 获取自身颜色 5 * 6 * @return 颜色 7 */ 8 String getColor(); 9 }
1 public class Apple implements IFruit { 2 3 @Override 4 public String getColor() { 5 return "red"; 6 } 7 }
1 public class Banana implements IFruit { 2 3 @Override 4 public String getColor() { 5 return "yellow"; 6 } 7 }
1 public class FruitFactory { 2 3 public static IFruit createFruit(String category) { 4 if ("apple".equals(category)) { 5 return new Apple(); 6 } else if ("banana".equals(category)) { 7 return new Banana(); 8 } 9 10 throw new RuntimeException("exception"); 11 } 12 }
1 public class Demo1Test { 2 3 public static void main(String[] args) { 4 IFruit apple = FruitFactory.createFruit("apple"); 5 System.err.println(apple.getColor()); 6 7 IFruit banana = FruitFactory.createFruit("banana"); 8 System.err.println(banana.getColor()); 9 } 10 }
2、工厂模式-工厂方法:
简单工厂模式在每次新增一个水果时都需要改动工厂类,这有违反开闭原则;而工厂方法则是在不违反开闭原则的情况下创建对象。
1 public interface IFruitFactory { 2 3 /** 4 * 创建水果 5 * 6 * @return 水果 7 */ 8 IFruit createFruit(); 9 }
1 public class AppleFactory implements IFruitFactory { 2 3 @Override 4 public IFruit createFruit() { 5 return new Apple(); 6 } 7 }
1 public class BananaFactory implements IFruitFactory { 2 3 @Override 4 public IFruit createFruit() { 5 return new Banana(); 6 } 7 }
1 public class FruitFactoryMap { 2 3 /** 4 * 利用map优化createFruitFactory函数 5 */ 6 private static final Map<String, IFruitFactory> FRUIT_MAP = new HashMap<>(); 7 8 static { 9 FRUIT_MAP.put("apple", new AppleFactory()); 10 FRUIT_MAP.put("banana", new BananaFactory()); 11 } 12 13 public static IFruitFactory createFruitFactory(String category) { 14 if (category == null || category.isEmpty()) { 15 throw new RuntimeException("exception"); 16 } 17 18 return FRUIT_MAP.get(category); 19 } 20 }
1 public class Demo2Test { 2 3 public static void main(String[] args) { 4 IFruitFactory appleFactory = FruitFactoryMap.createFruitFactory("apple"); 5 IFruit apple = appleFactory.createFruit(); 6 System.err.println(apple.getColor()); 7 8 IFruitFactory bananaFactory = FruitFactoryMap.createFruitFactory("banana"); 9 IFruit banana = bananaFactory.createFruit(); 10 System.err.println(banana.getColor()); 11 } 12 }
你可能会说这步更麻烦了嘛,的确在创建对象的逻辑仅仅只是new的话使用工厂方法确实麻烦了些。
正因这样才有了简单工厂存在的意义,简单工厂主要应用创建对象时过程简单,无复杂逻辑时使用。
而工厂方法则适用于创建对象时需要有特殊处理,或者说需要依赖其他外部信息。
3、抽象工厂:抽象工厂和工厂方法一样,只不过它拥有了创建多个工厂的能力,这里就不再赘述。