• 设计模式学习笔记(二、创建型-工厂模式)


    目录:

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

    什么是工厂模式

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

    为什么要有工厂模式

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

  • 相关阅读:
    修改linux的ssh默认端口号22的方法
    centos6 配置静态IP
    homebrew 无法安装提示不能在根目录下使用
    MySQL Replication 详解MySQL数据库设置主从同步的方法
    两台Mysql数据库数据同步实现
    MySql主从同步和延迟同步
    c#委托和事件
    C# Out和Ref区别
    MVC与三层架构
    经典数据库题
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/12639040.html
Copyright © 2020-2023  润新知