zoukankan      html  css  js  c++  java
  • 工厂模式和抽象工厂模式

          最近在啃设计模式,这篇文章是设计模式的第一篇,希望可以一直写下去。

          工厂模式和抽象工厂模式都属于创建型模式,是用来创建对象的。程序中将创建对象的操作(例如各种new)抽离到单独的接口中,由接口的子类来完成对象的创建工作,从而实现对象的创建与业务逻辑解耦的目的。这里所说的接口,既包括interface,也包括抽象类。

          下面以“饺子”作为例子来讲解这两种模式的用法,饺子是我们要生产的产品,而工厂是我们生产饺子的工具。饺子馅儿的口味有很多,这里只举出三种:韭菜、鲜肉、萝卜。

    1. 工厂模式

          工厂模式的做法是,每个产品对应一个工厂,由工厂来负责对应产品的创建工作,工厂模式将生成产品的任务交给具体的子类来完成,做到了与具体产品类的解耦。

          首先定义一个产品接口:

    1 public interface Dumpling{
    2     String getFlavor();  //获取饺子口味    
    3 }

          接下来是三个具体口味的饺子:

     1 public class FreshmeatDumpling implements Dumpling{
     2     String flavor = "鲜肉馅儿饺子";
     3 
     4     @Override
     5     public String getFlavor(){
     6         return flavor;
     7     }
     8 }
     9 
    10 public class LeekDumpling implements Dumpling{
    11     String flavor = "韭菜馅儿饺子";
    12 
    13     @Override
    14     public String getFlavor(){
    15         return flavor;
    16     }
    17 }
    18 
    19 public class RadishDumpling implements Dumpling{
    20     String flavor = "萝卜馅儿饺子";
    21 
    22     @Override
    23     public String getFlavor(){
    24         return flavor;
    25     }
    26 }

          产品定义好之后,需要定义工厂来生产这些产品,也就是饺子。

          先定义工厂接口:

    1 public interface DumplingFactory{
    2     Dumpling createDumpling();  //生产饺子
    3 }

          接下来为每一种饺子定义一个对应的工厂:

     1 public class FreshmeatDumplingFactory implements DumplingFactory{
     2     public Dumpling createDumpling(){
     3         return new FreshmeatDumpling();  //来一份鲜肉馅儿饺子
     4     }
     5 }
     6 
     7 public class LeekDumplingFactory implements DumplingFactory{
     8     public Dumpling createDumpling(){
     9         return new LeekDumpling();  //来一份韭菜馅儿饺子
    10     }
    11 }
    12 
    13 public class RedishRDumplingFactory implements DumplingFactory{
    14     public Dumpling createDumpling(){
    15         return new RedishDumpling();  //来一份萝卜馅儿饺子
    16     }
    17 }

          好了,所有的准备工作都做完了,现在就可以开心的点餐了^_^。

    1 public static void main(String[] args){
    2     DumplingFactory factory = new LeekDumpingFactory();
    3     Dumpling dumpling = factory.createDumpling();
    4     System.out.println(dumpling.getFlavor());  //韭菜馅儿饺子
    5 
    6     factory = new RedishDumplingFactory();
    7     dumpling = factory.createDumpling();
    8     System.out.println(dumpling.getFlavor());  //萝卜馅儿饺子
    9 }

    2. 抽象工厂模式

          抽象工厂模式的职责是创建一个产品簇,这往往意味着创建许多不同类型的产品,而工厂模式只负责创建单一产品。

          对于饺子来说,除了馅儿之外,一般还会放一些配料,例如:葱、姜、蒜等,那么此时我们就需要一个配料工厂专门生产这些配料了。这些配料属于不同的产品系,它们合在一起构成饺子的配料,我们把类似配料的这样的一系列产品称为产品簇,显然,工厂模式无法完成这个生产任务,这里就需要用到抽象工厂模式了。实际上,抽象工厂在生成每一类产品时,使用的还是工厂模式的原理。

          首先,是定义配料接口以及具体的配料子类。

          配料接口:

     1 //
     2 public interface Scallion{
     3     String getName();  
     4 }
     5 
     6 //
     7 public interface Ginger{
     8     String getName();  
     9 }
    10 
    11 //
    12 public interface Garlic{
    13     String getName();  
    14 }

          具体配料:

     1 public class GreenChineseonion implements Scallion{
     2     private String name = "大葱";
     3     public String getName(){
     4         return name;
     5     }
     6 }
     7 
     8 public class Shallot implements Scallion{
     9     private String name = "小葱";
    10     public String getName(){
    11         return name;
    12     }
    13 }
    14 
    15 public class RedGinger implements Ginger{
    16     private String name = "紫姜";
    17     public String getName(){
    18         return name;
    19     }
    20 }
    21 
    22 public class YellowGinger implements Ginger{
    23     private String name = "黄姜";
    24     public String getName(){
    25         return name;
    26     }
    27 }
    28 
    29 public class WhiteGarlic implements Garlic{
    30     private String name = "白皮蒜";
    31     public String getName(){
    32         return name;
    33     }
    34 }
    35 
    36 public class PurpleGarlic implements Garlic{
    37     private String name = "紫皮蒜";
    38     public String getName(){
    39         return name;
    40     }
    41 }

          接下来定义生产配料的工厂:

    1 public interface IngredientsFactory{
    2     Scallion createScallion();  //生产葱
    3     Ginger createGinger();      //生产姜
    4     Garlic createGarlic();        //生产蒜
    5 }

          然后定义具体配料工厂:

     1 // 鲜肉馅儿饺子配料
     2 public class FreshMeatDumplingIngredientsFactory implements IngredientsFactory{
     3     public Scallion createScallion(){
     4         return new Shallot();
     5     }
     6 
     7     public Ginger createGinger(){
     8         return new RedGinger();
     9     }
    10 
    11     public Garlic createGarlic(){
    12         return new WhiteGarlic();
    13     }
    14 }
    15 
    16 // 韭菜馅儿饺子配料
    17 public class LeekDumplingIngredientsFactory implements IngredientsFactory{
    18     public Scallion createScallion(){
    19         return new Shallot();
    20     }
    21 
    22     public Ginger createGinger(){
    23         return new RedGinger();
    24     }
    25 
    26     public Garlic createGarlic(){
    27         return new PurpleGarlic();
    28     }
    29 }
    30 
    31 // 萝卜馅儿饺子配料
    32 public class RadishDumplingIngredientsFactory implements IngredientsFactory{
    33     public Scallion createScallion(){
    34         return new GreenChineseonion();
    35     }
    36 
    37     public Ginger createGinger(){
    38         return new YellowGinger();
    39     }
    40 
    41     public Garlic createGarlic(){
    42         return new Garlic
    43     }
    44 }

          然后,就可以来点配料尝尝咸淡了。

    1 public static void main(String[] args){
    2     IngredientsFactory ingredientsFactory = new RadishDumplingIngredientsFactory();
    3     System.out.println(ingredientsFactory.createScallion().getName);
    4     System.out.println(ingredientsFactory.createGinger().getName);
    5     System.out.println(ingredientsFactory.createGarlic().getName);
    6 }

    3. 简单工厂

          一般提到工厂模式的时候,都会提到简单工厂,简单工厂是把所有产品的创建任务放在一个类里面完成,一旦有新的产品,就需要修改简单工厂里面的生产逻辑。

          关于饺子,一个简单工厂可能类似于:

     1 public class SimpleDumplingFactory{
     2     public Dumpling createDumpling(String type){
     3         switch(type){
     4             case "freshMeat":
     5               return new FreshMeatDumpling();
     6               break;
     7             case "leek":
     8               return new LeekDumpling();
     9               break;
    10             case "radish":
    11               return new RadishDumpling();
    12               break;
    13             default:
    14               return new FreshMeatDumpling();
    15               break;
    16         } 
    17      }
    18 }        

    4. 总结

          简单工厂是一个具体类,负责生产所有的产品,当有新的产品产生时,就需要修改生产产品的逻辑,不符合“对扩展开放,对修改关闭”的原则;工厂模式会为每个产品生成一个对应的工厂,当有新的产品出现时,只需要增加新的工厂即可;抽象工厂能够生成一个产品簇,其中的每一个生产产品的方法都是利用了工厂模式。

     5. 参考

    <<Head First设计模式>>

  • 相关阅读:
    课后作业之找水王
    SCRUM第二阶段第十天
    第九周总结
    冲刺一3
    用户项目
    预会热词统计
    冲刺一2
    冲刺一(一阶)1
    第八周总结
    小组合作
  • 原文地址:https://www.cnblogs.com/NaLanZiYi-LinEr/p/11487872.html
Copyright © 2011-2022 走看看