设计模式之工厂模式-抽象工厂(02)
分类:
IT文章
•
2024-01-18 10:47:18
(三)抽象工厂
抽象共厂的描述:抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的。它可以向客户端提供一个接口,是的客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象;
抽象工厂的角色及其职责:(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 }
View Code
工厂方法的工厂只生产一种类型的产品,而抽象工厂生产的产品更加丰富些;
(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 }
View Code
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 }
View Code
(3)抽象产品角色
3.1)所有抽象产品的公共的接口(学生的接口)
1 package com.pattern.factory.abstrac1;
2
3 //学生接口
4 //抽象角色
5 public interface Student {
6 //显示一下
7 void show();
8 }
View Code
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 }
View Code
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 }
View Code
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 }
View Code
(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 }
View Code
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 }
View Code
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 }
View Code
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 }
View Code
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 }
View Code
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 }
View Code
测试代码
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 }
View Code
结果:
![设计模式之工厂模式-抽象工厂(02) 设计模式之工厂模式-抽象工厂(02)](/default/index/img?u=aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvOTkyMjE5LzIwMTcwMy85OTIyMTktMjAxNzAzMTIyMzEyMDQxMzktMTAyMzQzMzA5MS5wbmc=)