• 设计模式之工厂模式-工厂方法(02)


    接着上一篇的工厂模式,工厂方法。由于简单工厂的扩展性不好,下面工厂方法,在这上面有了优化!

    (二)工厂方法(多态工厂模式)

      工厂方法描述:定义一个创建产品对象的工厂接口(总厂是接口,里面只规定了获得具体产品实例的方法,实际创建工作推迟到实现总厂接口的子类(分厂)当中。这样的好处是,可以在不修改具体工厂角色的情况下引进新的产品(即是不像简单工厂那样,增加一个具体产品,比如:增加了个浙大学生,要把在工厂中的方法中增加逻辑判断,),利于维护了;

      工厂方法的角色及其职责:(1)抽象工厂角色[creator]:该模式的核心(总厂),任何工厂(分厂)都必须实现这个接口(2)具体工厂角色[concrete creator](即分厂):具体工厂类是抽象工厂的一个实现,负责实例化产品对象;(3)抽象产品角色[product]:工厂方法所创建的所有对象的父类,他负责描述所有实例所共有的公共接口(4)具体产品[concrete product]:所创建的具体实例对象

    (1)抽象工厂角色(总厂

     1 package com.pattern.factory.method1;
     2 
     3 //抽象工厂角色类,具体的实例,去实现该接口的子类中获取
     4 //获得学生的工厂
     5 public interface StudentFactory {
     6     
     7     //获得学生的方法
     8     Student getStudent();
     9     
    10 }
    View Code

    (2)具体工厂角色厂)

      2.1)博士生工厂

     1 package com.pattern.factory.method1;
     2 
     3 //获得博士生的工厂
     4 public class DoctoralStudentFactory implements StudentFactory {
     5 
     6     @Override
     7     public Student getStudent() {
     8         
     9         return new DoctoralStudent();
    10     }
    11     
    12 }
    View Code

       2.2)研究生工厂

     1 package com.pattern.factory.method1;
     2 
     3 //获得研究生的工厂
     4 public class GraduateStudentFactory implements StudentFactory {
     5 
     6     @Override
     7     public Student getStudent() {
     8         
     9         return new GraduateStudent();
    10     }
    11     
    12 }
    View Code

       2.3)大学生工厂

     1 package com.pattern.factory.method1;
     2 
     3 //获得大学生的工厂
     4 public class UndergraduateStudentFactory implements StudentFactory {
     5 
     6     @Override
     7     public Student getStudent() {
     8         
     9         return new UndergraduateStudent();
    10     }
    11     
    12 }
    View Code

    (3)抽象产品角色(三类学生)

    1 package com.pattern.factory.method1;
    2 
    3 //学生接口
    4 //抽象角色
    5 public interface Student {
    6     //显示一下
    7     void show();
    8 }    
    View Code

    (4)具体产品

       4.1) 博士生

     1 package com.pattern.factory.method1;
     2 
     3 //博士生
     4 public class DoctoralStudent implements Student {
     5 
     6     @Override
     7     public void show() {
     8         System.out.println("博士生");
     9     }
    10 
    11 }
    View Code

     4.2)研究生

     1 package com.pattern.factory.method1;
     2 
     3 //研究生
     4 public class GraduateStudent implements Student {
     5 
     6     @Override
     7     public void show() {
     8         System.out.println("研究生");
     9     }
    10 
    11 }
    View Code

      4.3)大学生

     1 package com.pattern.factory.method1;
     2 
     3 //大学生
     4 public class UndergraduateStudent implements Student {
     5 
     6     @Override
     7     public void show() {
     8         System.out.println("大学生");
     9     }
    10 
    11 }
    View Code

    测试代码:

     1 package com.pattern.factory.method1;
     2 
     3 public class Test {
     4     
     5     public static void main(String[] args) {
     6         
     7         //1.招博士生,直接去博士工厂,
     8         DoctoralStudentFactory doctoralStudentFactory = new DoctoralStudentFactory();
     9         Student doctoralStu = doctoralStudentFactory.getStudent();
    10         doctoralStu.show();
    11         
    12         //2.招研究生,直接去研究生工厂,
    13         GraduateStudentFactory graduateStudentFactory = new GraduateStudentFactory();
    14         Student GraduateStu = graduateStudentFactory.getStudent();
    15         GraduateStu.show();
    16         
    17         //3.大学生,大学生厂
    18         UndergraduateStudentFactory undergraduateStudentFactory = new UndergraduateStudentFactory();
    19         Student undergraduateStu = undergraduateStudentFactory.getStudent();
    20         undergraduateStu.show();
    21     
    22     }
    23     
    24 }    
    View Code

    测试结果:

    总结:总厂是接口,分厂实现接口,抽象产品规定公共的行为,具体产品表现自己的内容;每个分厂对应生产一个具体的产品;

    下一篇:抽象工厂

  • 相关阅读:
    Linux下CVS安装和配置
    新开Blog 哈哈
    XP项目配置管理(1)——服务系统配置篇
    Perl中数组和哈希表的用法小结
    如何删除windows服务zz
    Java Thread
    [游戏开发]准备基于Starling开发
    make menuconfig 依赖的包
    ANDROID LOGO和动画制作
    cscope ctags
  • 原文地址:https://www.cnblogs.com/huaxueyihao/p/6533660.html
Copyright © 2020-2023  润新知