首页 > 其他 > 详细

二、创建型-工厂模式

时间:2020-04-05 22:18:57      阅读:70      评论:0      收藏:0      [点我收藏+]

目录:

  • 什么是工厂模式
  • 为什么要有工厂模式
  • 如何实现一个工厂模式

什么是工厂模式

工厂模式实际上就是封装了创建对象细节,将创建对象的细节与实际业务分离,达到解耦的目的。

为什么要有工厂模式

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、抽象工厂:抽象工厂和工厂方法一样,只不过它拥有了创建多个工厂的能力,这里就不再赘述。

二、创建型-工厂模式

原文:https://www.cnblogs.com/bzfsdr/p/12639040.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!