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:创建一个商品接口

    package FactoryMethod;
    /**
     * ********************************************************  
    * @ClassName: ProductInterface 
    * @Description: 产品接口,所有产品都必须实现此接口
    *  
    **********************************************************
     */
    public interface Product {
            public void say();
    }

      5.2:创建一个食品类 实现商品接口

    package FactoryMethod;
    /**
     * ********************************************************  
    * @ClassName: Food 
    * @Description: 食品类 
    *  
    **********************************************************
     */
    public class Food implements Product{
        @Override
        public void say() {
            System.out.println("我是食品");
        }
    }

      5.3:创建一个水果类 实现商品接口

    package FactoryMethod;
    /**
     * ********************************************************  
    * @ClassName: Fruits 
    * @Description: 水果类 
    *  
    **********************************************************
     */
    public class Fruits  implements Product{
    
        @Override
        public void say() {
            System.out.println("我是水果");
        }
    }

      5.4:创建工厂接口,所有具体工厂角色必须实现这个接口

    package FactoryMethod;
    /**
     * ********************************************************  
    * @ClassName: FactoryInterface 
    * @Description: 工厂接口,所有具体工厂角色必须实现此接口 
    *  
    **********************************************************
     */
    public interface FactoryInterface {
        public Product factory();
    }

      5.5:创建食品工厂类,实现工厂接口

    package FactoryMethod;
    /**
     * ********************************************************  
    * @ClassName: FoodFactory 
    * @Description: 食品工厂类
    *  
    **********************************************************
     */
    public class FoodFactory implements FactoryInterface{
    
        @Override
        public Product factory() {
            // TODO Auto-generated method stub
            return new Food();
        }
    }

      5.6:创建水果工厂类,实现工厂接口

    package FactoryMethod;
    /**
     * ********************************************************  
    * @ClassName: FruitsFactory 
    * @Description: 水果工厂类
    *  
    **********************************************************
     */
    public class FruitsFactory implements FactoryInterface{
    
        @Override
        public Product factory() {
            // TODO Auto-generated method stub
            return new Fruits();
        }
    
    }

      5.7:创建工厂方法模式测试客户端

    package FactoryMethod;
    /**
     * ********************************************************  
    * @ClassName: FactoryMethodTest 
    * @Description: 工厂方法模式测试类
    *  
    **********************************************************
     */
    public class FactoryMethodTest {
    
        public static void main(String[] args) {
            //获取食品工厂对象
            FactoryInterface foodFactory = new FoodFactory();
            //获取水果工厂对象
            FactoryInterface fruitsFactory = new FruitsFactory();
            //获取食品对象
            Product food = foodFactory.factory();
            //获取水果对象
            Product fruits =fruitsFactory.factory();
            //调用对象中的方法
            food.say();
            fruits.say();
        }
    
    }

      5.8:运行,得到如下结果

  • 相关阅读:
    iOS项目中常见的文件
    RN 导入原有Xcode项目中,引入Pod依赖出现的问题与解决
    Xcode中StoryBoard Reference 新特性的使用
    非等高cell实战(01)-- 实现微博页面
    iOS回顾笔记(09) -- Cell的添加、删除、更新、批量操作
    iOS回顾笔记(08) -- 自定义Cell的类型和创建步骤总结
    unittest中的测试固件
    unittest测试用例的执行顺序
    unittest各个组件之间的关系
    ubuntu16.04开机时的.local问题
  • 原文地址:https://www.cnblogs.com/shun-gege/p/7451992.html
Copyright © 2011-2022 走看看