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

运行结果

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

 

原文地址:https://www.cnblogs.com/leonkobe/p/4287880.html