码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(三)---抽象工厂模式

时间:2017-08-30 23:39:42      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:cto   工厂方法模式   oid   工厂   技术分享   测试   main   ges   script   

1、 简介:为创建一组相关或相互依赖的对象提供一个接口,无需指定它们的具体类。抽象工厂模式通常是用于创创建一族产品,并且这族产品分不同的等级;不同的具体工厂类生产不同等级的一族产品。

2、 抽象工厂UML图

  技术分享

3、抽象工厂示意性类图

  技术分享

4、类图分析

  从上图可以看出,抽象工厂模式涉及到以下四个角色

  4、1:抽象工厂:担任这个角色的是工厂方法模式的核心,它与应用无关,任何在模式中创建对象的工厂都必须实现这个接口,在实际应用中,这个角色由java抽象类或接口来实现

  4、2:具体工厂:担任这个角色的是抽象工厂的具体实现类,具体工厂含有业务逻辑,并受到客户端的调用创建产品对象,这个角色由java类来实现。

  4、3:抽象产品:这个角色是工厂方法模式创建的对象的超类型(父类),在实际应用中,由java抽象类或是接口来实现

  4、4:具体产品:这个角色实现了抽象产品角色声明的接口,工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

5、源代码

   5.1:声明一个抽象产品接口 ProductA  作为A产品族的父类

package AbstractFactory;
/**
 *    ********************************************************  
* @ClassName: Product 
* @Description: 商品A接口
*  
**********************************************************
 */
public interface ProductA {
    public void say();
}

  5.2:声明一个抽象产品接口 ProductB  作为B产品族的父类

package AbstractFactory;
/**
 * ********************************************************  
* @ClassName: ProductB 
* @Description: 商品B接口
*  
**********************************************************
 */
public interface ProductB {
    public void say();
}

  5.3:创建具体产品ProductA1 实现接口ProductA

package AbstractFactory;
/**
 * ********************************************************  
* @ClassName: ProductA1 
* @Description: 具体产品类ProductA1
*  
**********************************************************
 */
public class ProductA1 implements ProductA{
    public void say(){
        System.out.println("ProductA1");
    }
}

  5.4:创建具体产品ProductA2 实现接口ProductA

package AbstractFactory;
/**
 * ********************************************************  
* @ClassName: ProductA1 
* @Description: 具体产品类ProductA2
*  
**********************************************************
 */
public class ProductA2 implements ProductA{
    public void say(){
        System.out.println("ProductA2");
    }
}

  5.5:创建具体产品ProductB1 实现接口ProductB

package AbstractFactory;
/**
 * ********************************************************  
* @ClassName: ProductA1 
* @Description: 具体产品类ProductB1 
*  
**********************************************************
 */
public class ProductB1 implements ProductB{
    public void say(){
        System.out.println("ProductB1");
    }
}

  5.6:创建具体产品ProductB2 实现接口ProductB

package AbstractFactory;
/**
 * ********************************************************  
* @ClassName: ProductA1 
* @Description: 具体产品类ProductB2
*  
**********************************************************
 */
public class ProductB2 implements ProductB{
    public void say(){
        System.out.println("ProductB2");
    }
}

  5.7:创建实例化等级1产品的具体工厂类Product1Factory 实现IFactory工厂接口

package AbstractFactory;
/**
 * ********************************************************  
* @ClassName: ProductAFactory 
* @Description: 等级为1的产品族具体工厂类 
*  
**********************************************************
 */
public class Product1Factory  implements IFactory{
    public ProductA factoryA(){
        return new ProductA1();
    }
    
    public ProductB factoryB(){
        return new ProductB1();
    }
}

  5.8:创建实例化等级2产品的具体工厂类Product2Factory 实现IFactory工厂接口

package AbstractFactory;
/**
 * ********************************************************  
* @ClassName: ProductAFactory 
* @Description: 等级为2的产品族具体工厂类  
*  
**********************************************************
 */
public class Product2Factory  implements IFactory{
    public ProductA factoryA(){
        return new ProductA2();
    }
    
    public ProductB factoryB(){
        return new ProductB2();
    }
}

  5.9:创建抽象工厂测试类

package AbstractFactory;
/**
 * ********************************************************  
* @ClassName: AbstractFactoryTest 
* @Description: 抽象工厂测试类
*  
**********************************************************
 */
public class AbstractFactoryTest {

    public static void main(String[] args) {
        //分别获取两个工厂对象
        IFactory factory1 = new Product1Factory();
        IFactory factory2 = new Product2Factory();
        
        ProductA  productA1 = factory1.factoryA();
        ProductB  productB1 = factory1.factoryB();
        
        ProductA  productA2 = factory2.factoryA();
        ProductB  productB2 = factory2.factoryB();
        
        productA1.say();
        productB1.say();
        productA2.say();
        productB2.say();
    }

}

  5.10:运行结果如下

技术分享

设计模式(三)---抽象工厂模式

标签:cto   工厂方法模式   oid   工厂   技术分享   测试   main   ges   script   

原文地址:http://www.cnblogs.com/shun-gege/p/7453779.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!