• 设计模式之--工厂模式(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();
        }
        
    }

    运行结果

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

     

  • 相关阅读:
    点名
    2017.6.11 NOIP模拟赛
    HEOI 2012 旅行问题
    【1】【JUC】JDK1.8源码分析之ReentrantLock
    Git撤销&回滚操作
    源码分析之CountDownLatch
    【1】AQS详解
    循环屏障CyclicBarrier以及和CountDownLatch的区别
    【JUC】CountDownLatch
    匿名内部类中使用的外部局部变量为什么只能是final变量
  • 原文地址:https://www.cnblogs.com/leonkobe/p/4287880.html
Copyright © 2020-2023  润新知