zoukankan      html  css  js  c++  java
  • 设计模式之--工厂模式(Factory)

    定义:
    Defined an interface for creating an object,but let subclasses decide which class  to instantiate.
    Factory Method let a class defer instantiation to subclass
    (定义一个创建对象的接口,让子类类型来决定实例化对象。工厂方法能够使类的实例化延迟到具体的子类)
    工厂方法的泛型应用是关键

    类图:


    一 定义产品
      1 定义产品接口

    package dmode.factory;
    
    /**
     * 类描述:  战争接口
     * @version 1.0  CreateDate: 2015-2-12
     * 
     */
    public interface IWar {
        
        /**
         * 方法描述:发动战争
         *
         */
        public void warring();
        
        /**
         * 方法描述:进攻
         *
         */
        public void attack();
    }

      2 定义 产品实现

    package dmode.factory;
    
    /**
     * 类描述:  北美战场
     * @version 1.0  CreateDate: 2015-2-12
     */
    public class AmerWar implements IWar {
    
        /**
        *@see dmode.factory.IWar#warring()
        */
        @Override
        public void warring() {
            System.out.println("发动北美战争.....");
        }
    
        /**
        *@see dmode.factory.IWar#attack()
        */
        @Override
        public void attack() {
            System.out.println("北美战争开始");
        }
        
    }
    package dmode.factory;
    
    /**
     * 类描述:  亚洲战场
     * @version 1.0  CreateDate: 2015-2-12
     */
    public class AsiaWar implements IWar{
    
        /**
        *@see dmode.factory.IWar#warring()
        */
        @Override
        public void warring() {
            System.out.println("发动东亚战争.........");
        }
    
        /**
        *@see dmode.factory.IWar#attack()
        */
        @Override
        public void attack() {
            System.out.println("东亚战争开始...");
        }
    
        
    }

    二:定义工厂

      1 定义工厂接口

    package dmode.factory;
    
    /**
     * 类描述:  战场接口
     */
    public interface IWarFactory {
        
        /**
         * 方法描述:制造战争
         * <T extends IWar> 泛型方法, 限制了传入参数必须是战争的子类
         * Class<T> 可以做一个接收形参 
         */
        public <T extends IWar> T makeWar(Class<T> t);
    }

      2 定义工厂实现类

    package dmode.factory;
    
    /**
     * 类描述:  战场
     */
    public class WarFactory implements IWarFactory{
    
        /**
        *@see dmode.factory.IWarFactory#makeWar(java.lang.Class)
        */
        @Override
        public <T extends IWar> T makeWar(Class<T> t) {
            T instenc = null;
            try {
                instenc = t.newInstance();
            } catch (Exception e) {
                System.out.println("实例化战争异常...");
            }
            return instenc;
        }
    
    
        
    }

    三:调用场景
      

    package dmode.factory;
    
    /**
     * 类描述:  入口
     */
    public class Acce {
        public static void main(String[] args) {
            IWarFactory warFactory = new WarFactory();
            IWar warAsia = warFactory.makeWar(AsiaWar.class);
            warAsia.warring();
            warAsia.attack();
            IWar warAmer = warFactory.makeWar(AmerWar.class);
            warAmer.warring();
            warAmer.attack();
        }
        
    }

    运行结果

    发动东亚战争.........
    东亚战争开始...
    发动北美战争.....
    北美战争开始

     

  • 相关阅读:
    Confluence 6 创建你的个人空间
    Win10正式专业版激活方法
    还在手工写接口测试文档,已经out了
    MYSQL支持的数据类型-数值类型
    mysql
    转 聊聊连接池和线程
    当压测数据压不上去时可能是哪些原因造成的
    IDEA自动导包(全局设置)
    微服务化后缓存怎么做
    win10家庭版升级到专业版密钥
  • 原文地址:https://www.cnblogs.com/leonkobe/p/4287880.html
Copyright © 2011-2022 走看看