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

  • 相关阅读:
    HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】
    POJ Problem 2367 Genealogical tree【拓扑排序】
    HDU Problem 2647 Reward【拓扑排序】
    HDU Problem 1285 确定比赛名次【拓扑排序】
    HDU Problem HDU Today 【最短路】
    HDU Problem 3665 Seaside【最短路】
    HDU Problem 一个人的旅行 【最短路dijkstra】
    HDU Problem 1596 find the safest road【最短路dijkstra】
    Beyond Compare文本合并进行内容替换要注意什么
    用这些工具都可以比较代码的差异
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/12639040.html
Copyright © 2011-2022 走看看