设计模式-创建型设计模式之工厂方法模式

201 阅读2分钟

创建型模式-工厂方法模式

image.png

工厂方法模式

工厂方法模式是将对象的创建交给具体的工厂类,由具体的工厂类负责创建对应的对象。

在工厂方法模式中,定义一个抽象的工厂接口和一个抽象的产品接口,具体的工厂类实现工厂接口并创建对应的产品实例,而客户端通过工厂接口来获取需要的产品实例,从而将客户端和具体的产品实现分离开来。

举个例子:

现在需要创建一些角色,如鲁班七号、东皇太一等,这些角色都有三个技能,然后用工厂方法模式创建角色如下:

image.png

  • 抽象工厂:AbstractRoleFactory
  • 具体的工厂类:RoleFactory
  • 抽象产品接口:Role
  • 具体的产品实现:DongHuangTaiYiRole、LuBanQiHaoRole

抽象工厂-AbstractRoleFactory

public abstract class AbstractRoleFactory {  
  
    public abstract <T extends Role> T createRole(Class<T> tClass);  
}

具体的工厂类-RoleFactory

public class RoleFactory extends AbstractRoleFactory {  
    @Override  
    public <T extends Role> T createRole(Class<T> tClass) {  
        Role role = null;  
        try {  
            role = (T)Class.forName(tClass.getName()).newInstance();  
        } catch (Exception e) {  
            System.out.println("创建角色失败");  
        }  
        return (T)role;  
    }  
}

抽象产品接口-Role

public abstract class Role {  
    /**  
    * 技能1  
    */  
    abstract void skill1();  
    abstract void skill2();  
    abstract void skill3();  
}

具体的产品实现

东皇:

public class DongHuangTaiYiRole extends Role {  
  
    @Override  
    void skill1() {  
        System.out.println("技能1:日蚀祭典");  
    }  

    @Override  
    void skill2() {  
        System.out.println("技能2:曜龙烛兆");  
    }  

    @Override  
    void skill3() {  
        System.out.println("技能3:堕神契约");  
    }  
}

鲁班:

public class LuBanQiHaoRole extends Role {  
    @Override  
    void skill1() {  
        System.out.println("技能1:河豚雷");  
    }  

    @Override  
    void skill2() {  
        System.out.println("技能2:无敌鲨嘴炮");  
    }  

    @Override  
    void skill3() {  
        System.out.println("技能3:空中支援");  
    }  
}

使用

public class TestMain {  
    public static void main(String[] args) {  
        AbstractRoleFactory factory = new RoleFactory();  
        Role role = factory.createRole(DongHuangTaiYiRole.class);  
        role.skill1();  
        role.skill2();  
        role.skill3();  
    }  
}

抽象工厂模式优点:

  • 良好的扩展性,如果要添加新的角色,只需要实现Role接口创建实现类
  • 良好的封装性,不需要知道具体角色的创建,只需要说明想要的角色即可。

使用前需要考虑是否需要增加一个工厂类进行管理,增加代码的复杂度。

需要灵活、可扩展的框架时可以考虑采用工厂方法模式