设计模式之工厂模式-抽象工厂(02)
(三)抽象工厂
抽象共厂的描述:抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的。它可以向客户端提供一个接口,是的客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象;
抽象工厂的角色及其职责:(1)抽象工厂的角色[creator]:抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类型都必须实现这个接口(2)具体工厂[Concrete creator]:具体工厂是抽象工厂的一个实现,扶着实例化某个产品族中的产品对象。(3)抽象产品角色[product]:所有实例的共有的公共接口;(4)具体产品[Concrete product]:具体实例对象。
(1)抽象工厂的角色
1 package com.pattern.factory.abstrac1; 2 3 //抽象工厂角色类,相对于工厂方法,子类分厂中不在是只获得一个类型的学生 4 //获得学生的工厂 5 public interface StudentFactory { 6 7 //获得博士生 8 Student getDoctoralStudent(); 9 //获得研究生 10 Student getGraduateStudent(); 11 //获得大学生 12 Student getUnderGraduateStudent(); 13 14 }
工厂方法的工厂只生产一种类型的产品,而抽象工厂生产的产品更加丰富些;
(2)具体工厂
2.1)北大工厂
1 package com.pattern.factory.abstrac1; 2 3 //北大(Peking University)工厂,北大里的博士,研究,大学生 4 public class PekingUStudentFactory implements StudentFactory { 5 6 @Override 7 public Student getDoctoralStudent() { 8 9 return new PekingDoctoralStudent(); 10 } 11 12 @Override 13 public Student getGraduateStudent() { 14 15 return new PekingGraduateStudent(); 16 } 17 18 @Override 19 public Student getUnderGraduateStudent() { 20 21 return new PekingUndergraduateStudent(); 22 } 23 24 25 26 }
2.2)复旦工厂
1 package com.pattern.factory.abstrac1; 2 3 //复旦工厂,复旦里的博士,研究,大学生 4 public class FudanUStudentFactory implements StudentFactory { 5 6 //获得复旦博士生 7 @Override 8 public Student getDoctoralStudent() { 9 10 return new FudanDoctoralStudent(); 11 } 12 //获得复旦研究生 13 @Override 14 public Student getGraduateStudent() { 15 16 return new FudanGraduateStudent(); 17 } 18 19 //获得复旦大学生 20 @Override 21 public Student getUnderGraduateStudent() { 22 23 return new FudanUndergraduateStudent(); 24 } 25 26 }
(3)抽象产品角色
3.1)所有抽象产品的公共的接口(学生的接口)
1 package com.pattern.factory.abstrac1; 2 3 //学生接口 4 //抽象角色 5 public interface Student { 6 //显示一下 7 void show(); 8 }
3.2)不同类型产品的抽象类1(博士生的抽象类)
1 package com.pattern.factory.abstrac1; 2 3 //博士生类亦被抽象出来,同时实现学生类 4 public abstract class DoctoralStudent implements Student{ 5 6 public abstract void show(); 7 8 }
3.3)不同类型产品的抽象类2(研究生的抽象类)
1 package com.pattern.factory.abstrac1; 2 3 //研究生 4 public abstract class GraduateStudent implements Student { 5 6 @Override 7 public abstract void show(); 8 9 }
3.3)不同类型产品的抽象类3(大学生的抽象类)
1 package com.pattern.factory.abstrac1; 2 3 //大学生 4 public abstract class UndergraduateStudent implements Student { 5 6 @Override 7 public abstract void show(); 8 9 }
(4)具体产品
4.1)北大工厂的具体产品(北大博士生,研究生,大学生)
1 package com.pattern.factory.abstrac1; 2 3 //北大博士生 4 public class PekingDoctoralStudent extends DoctoralStudent { 5 6 @Override 7 public void show() { 8 System.out.println("北大博士生"); 9 } 10 11 }
1 package com.pattern.factory.abstrac1; 2 3 //北大研究生 4 public class PekingGraduateStudent extends DoctoralStudent { 5 6 @Override 7 public void show() { 8 System.out.println("北大研究生"); 9 } 10 11 }
1 package com.pattern.factory.abstrac1; 2 3 //北大大学生 4 public class PekingUndergraduateStudent extends DoctoralStudent { 5 6 @Override 7 public void show() { 8 System.out.println("北大大学生"); 9 } 10 11 }
4.2)复旦工厂的具体产品(复旦博士生,研究生,大学生)
1 package com.pattern.factory.abstrac1; 2 3 //复旦博士生 4 public class FudanDoctoralStudent extends DoctoralStudent { 5 6 @Override 7 public void show() { 8 System.out.println("复旦博士生"); 9 }//获得复旦大学生 10 11 }
1 package com.pattern.factory.abstrac1; 2 3 //复旦研究生 4 public class FudanGraduateStudent extends DoctoralStudent { 5 6 @Override 7 public void show() { 8 System.out.println("复旦大学生"); 9 } 10 11 }
1 package com.pattern.factory.abstrac1; 2 3 //复旦研究生 4 public class FudanUndergraduateStudent extends DoctoralStudent { 5 6 @Override 7 public void show() { 8 System.out.println("复旦研究生"); 9 } 10 11 }
测试代码
1 package com.pattern.factory.abstrac1; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 7 //现在具体的工厂两个,北大工厂,复旦工厂,两个工厂里都产博士生,研究生,大学生 8 //1.先创建 北大工厂 9 StudentFactory pekingUStudentFactory = new PekingUStudentFactory(); 10 //获得北大的博士生 11 Student doctoralStudent = pekingUStudentFactory.getDoctoralStudent(); 12 doctoralStudent.show(); 13 //获得北大的研究生 14 Student graduateStudent = pekingUStudentFactory.getGraduateStudent(); 15 graduateStudent.show(); 16 //获得北大大学生 17 Student underGraduateStudent = pekingUStudentFactory.getUnderGraduateStudent(); 18 underGraduateStudent.show(); 19 20 //同理获得复旦工厂,获得里面的学生 21 StudentFactory fudanUStudentFactory = new FudanUStudentFactory(); 22 Student doctoralStudent2 = fudanUStudentFactory.getDoctoralStudent(); 23 doctoralStudent2.show(); 24 25 Student graduateStudent2 = fudanUStudentFactory.getGraduateStudent(); 26 graduateStudent2.show(); 27 28 Student underGraduateStudent2 = fudanUStudentFactory.getUnderGraduateStudent(); 29 underGraduateStudent2.show(); 30 31 32 } 33 34 }
结果: