首页 > 代码库 > 设计模式之工厂模式-简单工厂(02)

设计模式之工厂模式-简单工厂(02)

设计模式分创建型、行为型、结构型;

工厂模式属于创建型模式,分(1)简单工厂(静态工厂)(2)工厂方法(3)抽象工厂,下面分别通过代码来介绍(本篇文章北风网的视频看后写的);

(一)简单工厂

  简单工厂描述:通过专门定义的一个类来创建其他类的实例,被创建的实例通常都具有共同的父类;

  简单工厂的角色及其职责:(1)工厂角色[creator]:该模式的核心,负责创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需要的产品实例(2)抽象角色[Product]:简单工厂模式 所创建的所有对象的父类,它负责描述所有实例所共有的公共接口(3)具体产品角色[Concrete Product]:创建出来的具体实例;

  下面是个代码例子:

  (1)工厂角色类

技术分享
 1 package com.sb.factory.simple;
 2 
 3 //工厂角色类
 4 //获得学生的工厂
 5 public class StudentFactory {
 6     
 7     //获得学生的方法,这个方法也可以写成静态的
 8     public Student getStudent(String collegeName){
 9         
10         if("北大".equals(collegeName)){
11             return new PekingUStudent();
12         }else if("清华".equals(collegeName)){
13             return new TsinghuaUStudent();
14         }else if("复旦".equals(collegeName)){
15             return new FudanUStudent();
16         }else{
17             System.out.println("其他的学校的学生");
18             return null;
19         }
20     }
21     
22 }
View Code

  (2)抽象角色(接口)

技术分享
1 package com.sb.factory.simple;
2 
3 //学生接口
4 //抽象角色
5 public interface Student {
6     //显示校训
7     void showXiaoXun();
8 }    
View Code

  (3)具体产品角色类(3个学校的学生)

    3.1  北大的学生

技术分享
 1 package com.sb.factory.simple;
 2 
 3 //北京大学(Peking University),北大的
 4 public class PekingUStudent implements Student{
 5     
 6     //北大校训
 7     public void showXiaoXun(){
 8         System.out.println("爱国、进步、民主、科学");
 9     }
10     
11     
12 }
View Code

    3.2  清华的学生

技术分享
 1 package com.sb.factory.simple;
 2 
 3 //清华大学(Tsinghua University),清华的
 4 public class TsinghuaUStudent implements Student{
 5     
 6     //清华校训
 7     public void showXiaoXun(){
 8         System.out.println("自强不息,厚德载物 ");
 9     }
10 
11 }
View Code

     3.2  复旦的学生

技术分享
 1 package com.sb.factory.simple;
 2 
 3 //复旦大学(Fudan University),复旦的
 4 public class FudanUStudent implements Student {
 5     
 6     //复旦校训
 7     public void showXiaoXun(){
 8         System.out.println("博学而笃志,切问而近思 ");
 9     }
10     
11 }
View Code

  (4)测试代码

技术分享
 1 package com.sb.factory.simple;
 2 
 3 public class Test {
 4     
 5     public static void main(String[] args) {
 6         
 7         //1.要想获得个的学生,得先造个工厂,从学生工厂里拿学生
 8         StudentFactory stuFactory = new StudentFactory();
 9         //2.学生工厂建成了,就可以去工厂里拿学生了(就像校园招聘一样)
10         //先招一个北大的
11         Student pekingStudent = stuFactory.getStudent("北大");
12         //调用方法,(考考他北大校训是啥啊,校训都答不上来,你上的是假北大吧)
13         pekingStudent.showXiaoXun();
14         
15         //同样获得复旦、清华的学生
16         Student tsinghuaStudent=stuFactory.getStudent("清华");
17         tsinghuaStudent.showXiaoXun();
18         
19         Student FudanStudent = stuFactory.getStudent("复旦");
20         FudanStudent.showXiaoXun();
21         
22         //这个学校,没有具体的实例,所以报错了(java.lang.NullPointerException)
23         Student beiniaoStudent = stuFactory.getStudent("北大青鸟");
24         beiniaoStudent.showXiaoXun();
25         
26     }
27     
28 }    
View Code

   测试结果:

技术分享

  最后一个由于没有具体实例,就报了空指针异常

    简单工厂的优点:逻辑判断放在了整个工厂类中,用户在使用时,根据外界给定的条件,或得到所要的对象,不需要了解对象是怎么创建以及如何组织的;

  缺点:违背了“开放,闭合”原则(对扩展是开放的,而对修改是封闭的),增加一个具体角色的实例,就得修改工厂里的逻辑判断,扩展性不好;

设计模式之工厂模式-简单工厂(02)