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

原文地址:http://zhangwei-david.iteye.com/blog/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. 产品簇中难以增加新的产品

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值