设计模式——抽象工厂模式

来源:互联网 发布:c语言最大公约数的英文 编辑:程序博客网 时间:2024/04/29 16:47

http://blog.csdn.net/dawanganban/article/details/9879427

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。



(1)创建一个Fruit接口

  1. package com.meritit;  
  2.   
  3. public interface Fruit {  
  4.   
  5.     /* 
  6.      * 采集 
  7.      */  
  8.     public void get();  
  9. }  

(2)创建一个Apple抽象类

  1. package com.meritit;  
  2.   
  3. public abstract class Apple implements Fruit{  
  4.     /* 
  5.      * 采集 
  6.      */  
  7.     public abstract void get();  
  8. }  

(3)创建一个Banana抽象类

  1. package com.meritit;  
  2.   
  3. public abstract class Banana implements Fruit{  
  4.     /* 
  5.      * 采集 
  6.      */  
  7.     public abstract void get();  
  8. }  

(4)实现抽象的Apple,分为南方和北方两个产品族

  1. package com.meritit;  
  2.   
  3. public class SouthApple extends Apple{  
  4.   
  5.     @Override  
  6.     public void get() {  
  7.         System.out.println("采集南方苹果");  
  8.     }  
  9.   
  10. }  

  1. package com.meritit;  
  2.   
  3. public class NorthApple extends Apple{  
  4.   
  5.     @Override  
  6.     public void get() {  
  7.         System.out.println("采集北方苹果");  
  8.     }  
  9.   
  10. }  

同样Banana也分为南方和北方

  1. package com.meritit;  
  2.   
  3. public class SouthBanana extends Banana{  
  4.   
  5.     @Override  
  6.     public void get() {  
  7.         System.out.println("采集南方香蕉");  
  8.     }  
  9.   
  10. }  

  1. package com.meritit;  
  2.   
  3. public class NorthBanana extends Banana{  
  4.   
  5.     @Override  
  6.     public void get() {  
  7.         System.out.println("采集北方香蕉");         
  8.     }  
  9. }  

(5)创建一个抽象的工厂方法(该工厂方法分为两个产品族

  1. package com.meritit;  
  2.   
  3. public interface FruitFactory {  
  4.     //实例化Apple  
  5.     public Fruit getApple();  
  6.     //实例化Banana  
  7.     public Fruit getBanana();  
  8. }  

(6)实现南方族工厂方法和北方族工厂方法

  1. package com.meritit;  
  2.   
  3.   
  4. public class SouthFruitFactory implements FruitFactory {  
  5.   
  6.     @Override  
  7.     public Fruit getApple() {  
  8.         return new SouthApple();  
  9.     }  
  10.   
  11.     @Override  
  12.     public Fruit getBanana() {  
  13.         return new SouthBanana();  
  14.     }  
  15.       
  16. }  

  1. package com.meritit;  
  2.   
  3. public class NorthFruitFactory implements FruitFactory{  
  4.   
  5.     @Override  
  6.     public Fruit getApple() {  
  7.         return new NorthApple();  
  8.     }  
  9.   
  10.     @Override  
  11.     public Fruit getBanana() {  
  12.         return new NorthBanana();  
  13.     }  
  14.   
  15.   
  16. }  

(7)可以根据族而实例化不同族不同产品对象

  1. package com.meritit;  
  2.   
  3. public class MainClass {  
  4.       
  5.     public static void main(String[] args) throws Exception {  
  6.         FruitFactory northFactory = new NorthFruitFactory();  
  7.         Fruit apple1 = northFactory.getApple();  
  8.         apple1.get();  
  9.         Fruit banana1 = northFactory.getBanana();  
  10.         banana1.get();  
  11.           
  12.         FruitFactory southFactory = new SouthFruitFactory();  
  13.         Fruit apple2 = southFactory.getApple();  
  14.         apple2.get();  
  15.         Fruit banana2 = southFactory.getBanana();  
  16.         banana2.get();  
  17.     }     
  18. }  

上面的关系如图


下面我们来看一下这种设计模式的好处,假如我们要添加一个温室族的产品。

(1)添加WenshiApple和WenshiBanana

  1. package com.meritit;  
  2.   
  3. public class WenshiApple extends Apple{  
  4.   
  5.     @Override  
  6.     public void get() {  
  7.         System.out.println("采集温室苹果");  
  8.     }  
  9.   
  10. }  


  1. package com.meritit;  
  2.   
  3. public class WenshiBanana extends Banana{  
  4.   
  5.     @Override  
  6.     public void get() {  
  7.         System.out.println("采集温室香蕉");  
  8.     }  
  9.   
  10. }  

(2)添加族工厂WenshiFruitFactory

  1. package com.meritit;  
  2.   
  3. public class WenshiFruitFactory implements FruitFactory{  
  4.   
  5.     @Override  
  6.     public Fruit getApple() {  
  7.         return new WenshiApple();  
  8.     }  
  9.   
  10.     @Override  
  11.     public Fruit getBanana() {  
  12.         return new WenshiBanana();  
  13.     }  
  14.   
  15. }  


现在的结构如图:


这样非常符合开放封闭原则,外部是开放的外部是封闭的。

但是这种方法也有缺点,当需要增加一个新的水果的时候,要对 每个族工厂进行代码的修改。

抽象工厂模式的角色:

(1)抽象工厂角色:抽象工厂模式的核心,包含多个产品结构声明,任何工厂类都必须实现这个接口。

(2)具体工厂角色:具体工厂类是抽象工厂的一个实现,负责实例化某个族的产品对象。

(3)抽象角色:抽象模式所创建的所有产品的父类,它负责描述所有实例所共有的接口。

(4)具体产品角色:抽象模式所创建的具体实例。

0 0
原创粉丝点击