zoukankan      html  css  js  c++  java
  • 设计模式(三)---抽象工厂模式

    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:运行结果如下

  • 相关阅读:
    unnitest简单场景应用
    接口基础之request
    docker常用命令
    管理之心理学
    管理团队挑战和提升
    如何留下核心成员
    管理之面试技巧
    复杂接口请求怎样写http请求
    gitlab使用(一)
    不使用AutoLayout快速兼容适配iPhone6/6 Plus
  • 原文地址:https://www.cnblogs.com/shun-gege/p/7453779.html
Copyright © 2011-2022 走看看