设计模式学习之工厂方法模式

工厂方法模式

工厂方法模式定义:Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.

                                (定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类)

工厂方法模式使用场景:

  1. 工厂方法模式是new一个对象的代替品,所以在使用需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,增加代码的复杂度。
  2. 需要灵活的、可扩展的框架时,可以考虑工厂方法模式。
  3. 工厂方法模式可以使用在异构项目中。
  4. 工厂方法模式可以用在测试驱动开发的框架下。

工厂方法模式的优点:

  1. 具有良好的封装性,代码结构清晰。一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道类名就可以,不需要知道创建对象的过程,降低模块之间的耦合。
  2. 工厂方法模式的扩展性非常优秀。
  3. 工厂方法模式是典型的解耦框架。

废话少说,上代码:

/**
 * @author Lin
 * @Date 2017/11/16.
* @Description 定义人类总称 人有不同的肤色,讲不同的语言
*/ public interface Human { /** *每个人种的肤色 */ void getCoor(); /** * 说话 */ void talk(); }

接下来定义三个人种,分别为黑人  白人  黄种人

/**
 * @author Lin
 * @Date 2017/11/16.
*/ public class BlackHuman implements Human { @Override public void getCoor() { System.out.println("黑色人种皮肤颜色是黑色的"); } @Override public void talk() { System.out.println("黑人会说鬼话。。。"); } } /** * @author Lin * @Date 2017/11/16. */ public class WhiteHuman implements Human { @Override public void getCoor() { System.out.println("白色人种皮肤颜色是白色的"); } @Override public void talk() { System.out.println("白色人种会说话,一般说的都是单字节。"); } } /** * @author Lin * @Date 2017/11/16. */ public class YellowHuman implements Human { @Override public void getCoor() { System.out.println("黄色人种皮肤颜色是黄色的"); } @Override public void talk() { System.out.println("黄色人种会说话,一般说的都是双字节。"); } }

三个人种定义完了,接下来需要定义制人工厂了

/**
 * @author Lin
 * @Date 2017/11/16.
 * @Descrition 抽象人类创建工厂
 */
public abstract class AbstractHumanFactory {

    public abstract <T extends Human> T createHuman(Class<T> c);

}

/**
 * @author Lin
 * @Date 2017/11/16.
 */
public class HumanFactory extends AbstractHumanFactory{

    @Override
    public <T extends Human> T createHuman(Class<T> c) {
        //定义一个生产的人钟
        Human human = null;
        try{
            human = (T)Class.forName(c.getName()).newInstance();
        }catch (Exception e){
            System.out.println("人种生成错误");
        }
        return (T) human;
    }
}

制人工厂有了,那最后就是生产了。

/**
 * @author Lin
 * @Date 2017/11/16.
 */
public class NvWa {

    public static void main(String[] args) {
        //声明创建一个人类工厂
        AbstractHumanFactory factory = new HumanFactory();
        System.out.println("---创造出第一批白色人种---");
        Human whiteHuman = 
        factory.createHuman(WhiteHuman.class);
        whiteHuman.getCoor();
        whiteHuman.talk();
        System.out.println("---创造出第二批黑色人种---");
        Human blackHuman = 
        factory.createHuman(BlackHuman.class);
        blackHuman.getCoor();
        blackHuman.talk();
        System.out.println("---创造出第三批黄色人种---");
        Human yellowHuman = 
        factory.createHuman(YellowHuman.class);
        yellowHuman.getCoor();
        yellowHuman.talk();
    }
}

 

posted @ 2018-01-03 16:38  随心-HL  阅读(195)  评论(0编辑  收藏  举报