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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之工厂模式-工厂方法(02)相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

技术分享
 1 package com.sb.factory.method;
 2 
 3 //抽象工厂角色类
 4 //获得学生的工厂,这个是总厂,是个接口
 5 public interface StudentFactory {
 6     
 7     //获得学生的方法,这个方法也可以写成静态的
 8     public Student getStudent();
 9     
10     
11 }
View Code

(2)具体工厂角色厂)

  2.1)北大工厂

技术分享
 1 package com.sb.factory.method;
 2 
 3 //北大工厂
 4 public class PekingUStudentFactory implements StudentFactory {
 5 
 6     @Override
 7     public Student getStudent() {
 8 
 9         return new PekingUStudent();
10     }
11 
12 }
View Code

  2.2)清华工厂

技术分享
 1 package com.sb.factory.method;
 2 
 3 //清华工厂
 4 public class TsinghuaUStudentFactory implements StudentFactory {
 5 
 6     @Override
 7     public Student getStudent() {
 8 
 9         return new TsinghuaUStudent();
10     }
11 
12 }
View Code

  2.3)复旦工厂

技术分享
 1 package com.sb.factory.method;
 2 
 3 //复旦工厂
 4 public class FudanUStudentFactory implements StudentFactory {
 5 
 6     @Override
 7     public Student getStudent() {
 8 
 9         return new FudanUStudent();
10     }
11 
12 }
View Code

(3)抽象产品角色

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

(4)具体产品

   4.1)北大学生

技术分享
 1 package com.sb.factory.method;
 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

  4.2)清华学生

技术分享
 1 package com.sb.factory.method;
 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

  4.3)复旦学生

技术分享
 1 package com.sb.factory.method;
 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

测试代码:

技术分享
 1 package com.sb.factory.method;
 2 
 3 public class Test {
 4     
 5     public static void main(String[] args) {
 6         
 7         //工厂方法的方式,就是把工厂扩大了,原来就是叫学生工厂,现在都有具体的分厂了(呵呵)
 8         //比如,现在想招北大的学生,直接去北大工厂去拿,所以先实例化北大工厂,
 9         StudentFactory pekingStufactory = new PekingUStudentFactory();
10         //拿到一个北大的学生
11         Student pekingStu = pekingStufactory.getStudent();
12         //回答校训
13         pekingStu.showXiaoXun();
14         
15         //同样,可以去拿清华,复旦的学生
16         StudentFactory tsingStuFactory = new TsinghuaUStudentFactory();
17         Student tsingStu = tsingStuFactory.getStudent();
18         tsingStu.showXiaoXun();
19         
20         StudentFactory fudanStudentFactory = new FudanUStudentFactory();
21         Student fudanStu = fudanStudentFactory.getStudent();
22         fudanStu.showXiaoXun();
23         
24     }
25     
26 }    
View Code

测试结果:

技术分享

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

下一篇:抽象工厂

以上是关于设计模式之工厂模式-工厂方法(02)的主要内容,如果未能解决你的问题,请参考以下文章

PHP面向对象之选择工厂和更新工厂

设计模式之工厂方法和抽象工厂

工厂模式之——工厂方法模式

PHP设计模式—工厂模式之工厂方法模式

设计模式之简单工厂模式

设计模式之工厂模式与工厂方法模式