设计模式分创建型、行为型、结构型;
工厂模式属于创建型模式,分(1)简单工厂(静态工厂)(2)工厂方法(3)抽象工厂,下面分别通过代码来介绍(本篇文章北风网的视频看后写的);
(一)简单工厂
简单工厂描述:通过专门定义的一个类来创建其他类的实例,被创建的实例通常都具有共同的父类;
简单工厂的角色及其职责:(1)工厂角色[creator]:该模式的核心,负责创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需要的产品实例(2)抽象角色[Product]:简单工厂模式 所创建的所有对象的父类,它负责描述所有实例所共有的公共接口(3)具体产品角色[Concrete Product]:创建出来的具体实例;
下面是个代码例子:
(1)工厂角色类
1 package com.pattern.factory.simple1; 2 3 //工厂角色类 4 //获得学生的工厂 5 public class StudentFactory { 6 7 //获得学生的方法,这个方法也可以写成静态的 8 public Student getStudent(String stuType){ 9 10 if("大学生".equals(stuType)){ 11 return new UndergraduateStudent(); 12 }else if("研究生".equals(stuType)){ 13 return new GraduateStudent(); 14 }else if("博士生".equals(stuType)){ 15 return new DoctoralStudent(); 16 }else{ 17 System.out.println("小学神,没有该类"); 18 return null; 19 } 20 } 21 22 }
(2)抽象角色(接口)
1 package com.pattern.factory.simple1; 2 3 //学生接口 4 //抽象角色 5 public interface Student { 6 //显示一下 7 void show(); 8 }
(3)具体产品角色类(3类学生)
3.1 博士生
1 package com.pattern.factory.simple1; 2 3 //博士生 4 public class DoctoralStudent implements Student { 5 6 @Override 7 public void show() { 8 System.out.println("博士生"); 9 } 10 11 }
3.2 研究生
1 package com.pattern.factory.simple1; 2 3 //研究生 4 public class GraduateStudent implements Student { 5 6 @Override 7 public void show() { 8 System.out.println("研究生"); 9 } 10 11 }
3.2 大学生
1 package com.pattern.factory.simple1; 2 3 //大学生 4 public class UndergraduateStudent implements Student { 5 6 @Override 7 public void show() { 8 System.out.println("大学生"); 9 } 10 11 }
(4)测试代码
1 package com.pattern.factory.simple1; 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 doctoralStu = stuFactory.getStudent("博士生"); 12 //证明一下自己 13 doctoralStu.show(); 14 15 //同样再去招研究生,大学生 16 Student graduateStu = stuFactory.getStudent("研究生"); 17 graduateStu.show(); 18 Student undergraduateStu = stuFactory.getStudent("大学生"); 19 undergraduateStu.show(); 20 21 //传一个小学生 22 Student stu = stuFactory.getStudent("小学生"); 23 stu.show(); 24 } 25 26 }
测试结果:
最后一个由于没有具体实例,就报了空指针异常
简单工厂的优点:逻辑判断放在了整个工厂类中,用户在使用时,根据外界给定的条件,或得到所要的对象,不需要了解对象是怎么创建以及如何组织的;
缺点:违背了“开放,闭合”原则(对扩展是开放的,而对修改是封闭的),增加一个具体角色的实例,就得修改工厂里的逻辑判断,扩展性不好;