66.设计模式笔记-工厂方法模式

转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/78426332
本文出自:猴菇先生的博客

1.定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。

2.使用场景
在任何需要生成复杂对象的地方,都可以用工厂方法模式,用new就可以完成创建的对象无需使用。

3.说明
需要产品抽象类定义产品的功能,具体产品类实现具体逻辑,工厂抽象类定义工厂的功能,
具体工厂类实现生产产品的逻辑,需要哪个产品就生成哪个产品的实例,有时候也可以利用
反射的方式更简洁的生产具体对象。

4.例子

/**
 * 产品抽象类,定义产品功能
 */
public abstract class Computer{
    public abstract void open();
}
/**
 * 具体的产品类,可以有多个,重写抽象方法,定义业务逻辑
 */
public class LenovoComputer extends Computer{
    @Override
    public void open(){
        System.out.println("打开联想电脑");
    }
}

public class AlienComputer extends Computer{
    @Override
    public void open(){
        System.out.println("打开外星人电脑");
    }
}

public class MacComputer extends Computer{
    @Override
    public void open(){
        System.out.println("打开苹果电脑");
    }
}
public abstract class Factory{
    /**
     * 某电脑类型的工厂方法
     *
     * @param clz 电脑的类型
     *
     * @return 具体型号的电脑对象
     */
    public abstract <T extends Computer> T createComputer(Class<T> clz); 
}
/**
 * 工厂的具体实现类,负责创建并返回具体产品对象
 */
public class ComputerFactory extends Factory{

    @SuppressWarnings("unchecked")
    @Override
    public <T extends Computer> T createComputer(Class<T> clz){
        Computer computer = null;
        try{
            computer = (Computer)Class.forName(clz.getName()).newInstance();
        }catch(Exception e){
            e.printStackTrace();
        }
        return (T)computer;
    }
}
public class Test{
    public static void main(String[] args){
        Factory factory = new ComputerFactory();

        LenovoComputer lenovo = factory.createComputer(LenovoComputer.class);
        lenovo.open();

        AlienComputer alien = factory.createComputer(AlienComputer.class);
        alien.open();

        MacComputer mac = factory.createComputer(MacComputer.class);
        mac.open(); 
    }
}

4.总结
优点:降低了对象之间的耦合度,而且依赖于抽象的架构,其将实例化的任务交由子类去完成,有很好的拓展性。

缺点:每次添加新产品时就要编写新的产品类,同时还要引入抽象层,导致类结构的复杂化。

猜你喜欢

转载自blog.csdn.net/qq_31715429/article/details/78426332