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

    工厂方法模式

      简单工厂模式有一个问题就是,类的创建依赖工厂类。

      如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?

      就用到工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
      

      新建酒的接口:

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

      新建工厂的接口:

    1 public interface Make {
    2     /**
    3      * 造酒的接口,造不同的酒,返回不同的酒味
    4      * @return Liqueur
    5      */
    6     public Liqueur makeLiqueur();
    7 }

     创建酒的实现类:

      (1)闷倒驴味道

    1 public class Mdl implements Liqueur {
    2     @Override
    3     public void taste() {
    4         System.out.println("我是闷倒驴,辣的!");
    5     }
    6 }

      (2)跑舌头味道

    1 public class Pst implements Liqueur {
    2     @Override
    3     public void taste() {
    4         System.out.println("我是跑舌头,苦的!");
    5     }
    6 }

    创建工厂实现类:

    (1)制造闷倒驴工厂

     1 /**
     2  * 制造闷倒驴工厂
     3  */
     4 public class MakeMdlFactory implements Make{
     5     /**
     6      * 制造闷倒驴
     7      * @return 闷倒驴味道
     8      */
     9     @Override
    10     public Liqueur makeLiqueur() {
    11         return new Mdl();
    12     }
    13 }

     (2)制造跑舌头工厂

     1 /**
     2  * 制造跑舌头工厂
     3  */
     4 public class MakePstFactory implements Make {
     5     /**
     6      * 制造跑舌头
     7      * @return 跑舌头味道
     8      */
     9     @Override
    10     public Liqueur makeLiqueur() {
    11         return new Pst();
    12     }
    13 }

      测试:

     1 public class LiqueurTest {
     2 
     3     public static void main(String[] args){
     4         Make mdlFactory = new MakeMdlFactory();
     5         Liqueur mdl = mdlFactory.makeLiqueur();
     6         mdl.taste();
     7 
     8         Make pstFactory = new MakeMdlFactory();
     9         Liqueur pst = pstFactory.makeLiqueur();
    10         mdl.taste();
    11     }
    12 }
    1 我是闷倒驴,辣的!
    2 我是闷倒驴,辣的!

      这个模式的好处就是,如果你想增加功能(增加一种酒叫二闺女),只需做一个实现类,实现Liqueur接口,同时做一个工厂类,实现Make接口,就OK了。

      无需去改动现成的代码,这样做,拓展性较好!

  • 相关阅读:
    Codeforces Round #687 A. Prison Break
    最小生成树自用笔记(Kruskal算法+prim算法)
    Codeforces Round #686 (Div. 3)(A->D)(模拟,vector,数学)
    Acwing 852. spfa判断负环
    Linux内核分析_课程学习总结报告
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    深入理解系统调用
    基于mykernel 2.0编写一个操作系统内核
    何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?——参考试题
    TCP三次握手Linux源码解析
  • 原文地址:https://www.cnblogs.com/yeshensi/p/11676642.html
Copyright © 2011-2022 走看看