关键词搜索

源码搜索 ×
×

程序设计之Java设计模式(抽象工厂模式)

发布2015-03-01浏览994次

详情内容

原文地址:http://zhangwei-david.iteye.com/bloghttps://files.jxasp.com/image/2187627,该文通俗易懂,实为经典!

      在设计模式一书中是这样描述抽象工厂的意图的: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的实现类。

    使用场景:一个系统要独立于它的产品创建、组合和表示时,且一个该系统提供多个产品系列,系统每次仅消费其中一个系类时可以使用抽象工厂模式。

    假设现在手机厂商在生产手机(phone)的同时也生产平板(Pad)(这两个产品是一个系列,都是移动端产品),简单的定义两个产品接口

Java代码   收藏代码
  1. /** 
  2.  * 
  3.  * @author zhangwei_david 
  4.  * @version $Id: Pad.java, v 0.1 2015年2月28日 下午4:54:33 zhangwei_david Exp $ 
  5.  */  
  6. public interface Pad {  
  7.     public String getBrand();  
  8. }  
Java代码   收藏代码
  1. /** 
  2.  * 
  3.  * @author zhangwei_david 
  4.  * @version $Id: Phone.java, v 0.1 2015年2月28日 下午4:28:34 zhangwei_david Exp $ 
  5.  */  
  6. public interface Phone {  
  7.   
  8.     public String getBrand();  
  9.   
  10. }  

 不同厂商生产的产品的品牌一定是不同的,定义两组具体实现类

Java代码   收藏代码
  1. /** 
  2.  * 
  3.  * @author zhangwei_david 
  4.  * @version $Id: Ipad.java, v 0.1 2015年2月28日 下午4:55:06 zhangwei_david Exp $ 
  5.  */  
  6. public class Ipad implements Pad {  
  7.   
  8.     /** 
  9.      * @see com.pattern.create.abstractFactory.product.Pad#getBrand() 
  10.      */  
  11.     @Override  
  12.     public String getBrand() {  
  13.         return "APPLE";  
  14.     }  
  15.   
  16. }  

 

Java代码   收藏代码
  1. /** 
  2.  * 
  3.  * @author zhangwei_david 
  4.  * @version $Id: Iphone4.java, v 0.1 2015年2月28日 下午4:35:50 zhangwei_david Exp $ 
  5.  */  
  6. public class Iphone implements Phone {  
  7.   
  8.     private static final String BRAND = "APPLE";  
  9.   
  10.     /** 
  11.      * @see com.pattern.create.abstractFactory.product.Phone#getBrand() 
  12.      */  
  13.     @Override  
  14.     public String getBrand() {  
  15.         return BRAND;  
  16.     }  
  17.   
  18. }  

 第二组产品:

Java代码   收藏代码
  1. /** 
  2.  * 
  3.  * @author zhangwei_david 
  4.  * @version $Id: MiPad.java, v 0.1 2015年2月28日 下午4:55:53 zhangwei_david Exp $ 
  5.  */  
  6. public class MiPad implements Pad {  
  7.   
  8.     /** 
  9.      * @see com.pattern.create.abstractFactory.product.Pad#getBrand() 
  10.      */  
  11.     @Override  
  12.     public String getBrand() {  
  13.         return "MI";  
  14.     }  
  15.   
  16. }  
Java代码   收藏代码
  1. /** 
  2.  * 
  3.  * @author zhangwei_david 
  4.  * @version $Id: MiPhone.java, v 0.1 2015年2月28日 下午4:36:50 zhangwei_david Exp $ 
  5.  */  
  6. public class MiPhone implements Phone {  
  7.   
  8.     private static final String BRAND = "MI";  
  9.   
  10.     /** 
  11.      * @see com.pattern.create.abstractFactory.product.Phone#getBrand() 
  12.      */  
  13.     @Override  
  14.     public String getBrand() {  
  15.         return BRAND;  
  16.     }  
  17.   
  18. }  

 通过上面两组产品可以发现,每组产品的品牌都是一致的,也就是在工厂生产的时候不可能一条生产线上生成两种不同的品牌产品(山寨除外)

 

定义一个抽象工厂的接口,该接口提供生产一组产品的操作

Java代码   收藏代码
  1. /** 
  2.  * 
  3.  * @author zhangwei_david 
  4.  * @version $Id: AbstractFactory.java, v 0.1 2015年2月28日 下午4:27:57 zhangwei_david Exp $ 
  5.  */  
  6. public interface AbstractFactory {  
  7.   
  8.     public Phone createPhone();  
  9.   
  10.     public Pad createPad();  
  11. }  

 有两个具体实现类:

Java代码   收藏代码
  1. public class AppleFactory implements AbstractFactory {  
  2.   
  3.     /** 
  4.      * @see com.pattern.create.abstractFactory.AbstractFactory#createPhone() 
  5.      */  
  6.     @Override  
  7.     public Phone createPhone() {  
  8.         return new Iphone();  
  9.     }  
  10.   
  11.     /** 
  12.      * @see com.pattern.create.abstractFactory.AbstractFactory#createPad() 
  13.      */  
  14.     @Override  
  15.     public Pad createPad() {  
  16.         return new Ipad();  
  17.     }  
  18.   
  19. }  
Java代码   收藏代码
  1. public class MiFactory implements AbstractFactory {  
  2.   
  3.     /** 
  4.      * @see com.pattern.create.abstractFactory.AbstractFactory#createPhone() 
  5.      */  
  6.     @Override  
  7.     public Phone createPhone() {  
  8.         return new MiPhone();  
  9.     }  
  10.   
  11.     /** 
  12.      * @see com.pattern.create.abstractFactory.AbstractFactory#createPad() 
  13.      */  
  14.     @Override  
  15.     public Pad createPad() {  
  16.         return new MiPad();  
  17.     }  
  18.   
  19. }  
Java代码   收藏代码
  1. public class Client {  
  2.   
  3.     /** 
  4.      * 
  5.      * @param args 
  6.      */  
  7.     public static void main(String[] args) {  
  8.         AbstractFactory appleFactory = new AppleFactory();  
  9.         System.out.println(appleFactory.createPad().getBrand() + " PAD");  
  10.         System.out.println(appleFactory.createPhone().getBrand() + " PHONE");  
  11.   
  12.         AbstractFactory miFactory = new MiFactory();  
  13.         System.out.println(miFactory.createPad().getBrand() + " PAD");  
  14.         System.out.println(miFactory.createPhone().getBrand() + " PHONE");  
  15.     }  
  16.   
  17. }  

 结果:

Java代码   收藏代码
  1. APPLE PAD  
  2. APPLE PHONE  
  3. MI PAD  
  4. MI PHONE  

优点:

  1. 分离了具体的类
  2. 易于更换产品系列
  3. 有利于维护产品一致性

缺点:

  1. 产品簇中难以增加新的产品

抽象工厂和工厂方法的比较:

     抽象工厂和工厂方法都分离了工厂接口和具体实现,不同点是工厂方法中仅抽象一个产品,有多个产品的实现,在抽象工厂中有多个抽象产品,有多组产品实现,但是具体工厂只能提供其中一组产品!


相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载