工厂方法模式

一)故事
女娲造人,创造白人,创造黑人,创造黄人。

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

三)代码例子
由四部分组成:1)抽象工厂类;2)具体工厂类;3)抽象产品类;4)具体产品类(可多个);
1)抽象工厂类
/**
 *  抽象工厂类
 * 
 * @author levovo
 */
public abstract class AbsFactory {
    public abstract <T extends AbsProduct> T createProduct(Class<T> c);
}

2)具体工厂类
/**
 *  具体工厂类
 * 
 * @author levovo
 */
public class ConcreteFactory extends AbsFactory {
    @Override
    public <T extends AbsProduct> T createProduct(Class<T> c) {
        AbsProduct product = null;
        try {
            product = (AbsProduct)Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            // 异常处理
        }
        return (T)product;
    }
}

3)抽象产品类
/**
 *  抽象产品类
 * 
 * @author levovo
 */
public abstract class AbsProduct {
    // 产品类的公共方法
    public void method1() {
        System.out.println("AbsProduct()->method1()");
    }
    // 抽象方法
    public abstract void method2();
}

4)具体产品类
/**
 *  具体产品类1
 * 
 * @author levovo
 */
public class ConcreteProduct1 extends AbsProduct {
    @Override
    public void method2() {
        // 业务逻辑处理
        System.out.println("ConcreteProduct1()->method2()");
    }
}

/**
 *  具体产品类2
 * 
 * @author levovo
 */
public class ConcreteProduct2 extends AbsProduct {
    @Override
    public void method2() {
        // 业务逻辑处理
        System.out.println("ConcreteProduct2()->method2()");
    }
}

场景使用例子
/**
 *  场景使用例子
 * 
 * @author levovo
 */
public class Client {
    public static void main(String[] args) {
        // 工厂类
        AbsFactory factory = new ConcreteFactory();
        // 创造产品类1
        AbsProduct product1 = factory.createProduct(ConcreteProduct1.class);
        product1.method1();
        product1.method2();
        // 创造产品类2
        AbsProduct product2 = factory.createProduct(ConcreteProduct2.class);
        product2.method1();
        product2.method2();
    }
}

四)优点
良好的封装性,代码结构清晰,降低模块间的耦合,扩展性非常优秀,

五)缺点

六)使用场景
1)需要灵活、可扩展的框架时,可以考虑采用工厂方法模式。万物皆对象,那万物就皆产品类,例子需要设计一个连接邮件服务器的框架,有三种网络协议可供选择:POP3,IMAP,HTTP,我们就可以把这三种连接方法作为产品类。如此设计,可以做到完美的扩展,如某些邮件服务器提供了WebService接口,很好,我们只要增加一个产品类就可以了。
2)不同品牌的轿车。
3)一个对象拥有很多子类。

七)注意事项

八)扩展
1)缩小为简单工厂模式(就是把抽象工厂类去掉,在create***()前面增加static关键字)
2)升级为多个工厂模式
3)替代单例模式
4)延迟初始化,例如:限制某一个产品类的最大实例化数量,可以通过判断Map中已有的对象数量来实现,这样的处理是非常有意义的,例子JDBC连接数据库,都会要求设置一个MaxConnections最大连接数量,该数量就是内存中最大实例化的数量。延迟加载还可以用在对象初始化比较复杂的情况下,例子硬件访问,涉及多方面的交互,则可以通过延迟加载降低对象的产生和销毁带来的复杂性。

九)总结
当设计灵活、可扩展的框架时,考虑使用工厂方法模式,可以完善的扩展。(扩展就是新增一个产品类)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值