zoukankan      html  css  js  c++  java
  • 设计模式之美—抽象工厂模式

    抽象工厂模式

      – 简单工厂模式 :用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)

      – 工厂方法模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)

      – 抽象工厂模式 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

    抽象工厂的结构:

    • 抽象工厂:提供创建产品的接口,可以创建多个不同等级的产品。
    • 具体工厂:完成具体产品的创建。
    • 抽象产品:定义产品规范,描述特性和功能。
    • 具体产品:实现具体的产品。

      抽象工厂:

     1 public interface Make {
     2     /**
     3      * 造酒的接口,制造52度的酒
     4      * @return Liqueur
     5      */
     6     public Liqueur makeLiqueur52();
     7 
     8     /**
     9      * 造酒的接口,制造42度的酒
    10      * @return Liqueur
    11      */
    12     public Liqueur makeLiqueur42();
    13 }

      具体工厂:制造闷倒驴工厂

     1 /**
     2  * 制造闷倒驴工厂(代表闷倒驴这一族)
     3  */
     4 public class MakeMdlFactory implements Make{
     5 
     6     /**
     7      * 制造52度闷倒驴
     8      * @return 52度闷倒驴味道
     9      */
    10     @Override
    11     public Liqueur makeLiqueur52() {
    12         return new Mdl52();
    13     }
    14 
    15     /**
    16      * 制造42度闷倒驴
    17      * @return 42度闷倒驴味道
    18      */
    19     @Override
    20     public Liqueur makeLiqueur42() {
    21         return new Mdl42();
    22     }
    23 }

      具体工厂:制造跑舌头工厂

     1 /**
     2  * 制造跑舌头工厂(代表跑舌头这一族)
     3  */
     4 public class MakePstFactory implements Make {
     5 
     6     /**
     7      * 制造52度跑舌头
     8      * @return 52度跑舌头味道
     9      */
    10     @Override
    11     public Liqueur makeLiqueur52() {
    12         return new Pst52();
    13     }
    14 
    15     /**
    16      * 制造42度跑舌头
    17      * @return 42度跑舌头味道
    18      */
    19     @Override
    20     public Liqueur makeLiqueur42() {
    21         return new Pst42();
    22     }
    23 }

      抽象产品:接口

    1 public interface Liqueur {
    2     public void taste();//酒味
    3 }

      抽象产品:闷倒驴抽象类

    1 /**
    2  * 闷倒驴抽象类
    3  */
    4 public abstract class Mdl implements Liqueur {
    5     public abstract void taste();
    6 }

      抽象产品:跑舌头抽象类

    1 /**
    2  * 跑舌头抽象类
    3  */
    4 public abstract class Pst implements Liqueur {
    5     public abstract void taste();
    6 }

      具体产品:42度闷倒驴

    /**
     * 42度闷倒驴
     */
    public class Mdl42 extends Mdl {
        @Override
        public void taste() {
            System.out.println("42度闷倒驴,辣的");
        }
    }

      具体产品:52度闷倒驴

    1 /**
    2  * 52度闷倒驴
    3  */
    4 public class Mdl52 extends Mdl {
    5     @Override
    6     public void taste() {
    7         System.out.println("52度闷倒驴,特别辣");
    8     }
    9 }

      具体产品:42度跑舌头

    1 /**
    2  * 42度跑舌头
    3  */
    4 public class Pst42 extends Pst {
    5     @Override
    6     public void taste() {
    7         System.out.println("42度跑舌头,苦的");
    8     }
    9 }

      具体产品:52度跑舌头

    1 /**
    2  * 52度跑舌头
    3  */
    4 public class Pst52 extends Pst {
    5     @Override
    6     public void taste() {
    7         System.out.println("52度跑舌头,特别苦");
    8     }
    9 }

      

      测试:

     1 public class LiqueurTest {
     2 
     3     public static void main(String[] args){
     4         Make mdlFactory = new MakeMdlFactory();
     5         Liqueur mdl42 = mdlFactory.makeLiqueur42();
     6         Liqueur mdl52 = mdlFactory.makeLiqueur52();
     7         mdl42.taste();
     8         mdl52.taste();
     9 
    10         Make pstFactory = new MakePstFactory();
    11         Liqueur pst42 = pstFactory.makeLiqueur42();
    12         Liqueur pst52 = pstFactory.makeLiqueur52();
    13         pst42.taste();
    14         pst52.taste();
    15     }
    16 }

      

      结果:

    1 42度闷倒驴,辣的
    2 52度闷倒驴,特别辣
    3 42度跑舌头,苦的
    4 52度跑舌头,特别苦

      与工厂方法模式相比, 抽象工厂模式中的具体工厂不只是创建一种具体对象, 它负责创建一组(族)具体对象。

      总结:用工厂模式主要是代替new操作,将创建对象统一管理和控制,从而将调用者与实现类解耦。

  • 相关阅读:
    论信息系统项目的范围管理
    Windows服务/Linux守护创建及安装
    C#开源网络通信库PESocketde的使用
    Unity本地持久化类PlayerPrefs使用详解
    记录一个闪烁,跳动,光圈的动画
    一、Linux驱动学习-了解系统
    用c#自己实现一个简单的JSON解析器
    highcharts的yAxis标题过长 分行显示
    Mysql binlog恢复数据
    Xamarin.Forms实例旅行日志
  • 原文地址:https://www.cnblogs.com/yeshensi/p/11677377.html
Copyright © 2011-2022 走看看