zoukankan      html  css  js  c++  java
  • 设计模式学习笔记(二、创建型-工厂模式)

    目录:

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

    什么是工厂模式

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

    为什么要有工厂模式

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

  • 相关阅读:
    图数据库查询语言
    深入探索Spring Data JPA, 从Repository 到 Specifications 和 Querydsl
    axios 浏览器内存泄露问题解决
    给Swagger换一套皮肤 Knife4j集成记录
    根据经纬度和半径计算经纬度范围
    最火 Web 前端组态软件 (可视化)
    Python-----删除给定目录下的所有文件
    Python----发送邮件yagmail
    python------将"["1","2"]"类型是字符串,转换为["1","2"]类型为列表,即eval()用法
    python----自动生成requirements.txt与导入requirements.txt中的库
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/12639040.html
Copyright © 2011-2022 走看看