一)故事
女娲造人,创造白人,创造黑人,创造黄人。
二)定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
三)代码例子
由四部分组成:1)抽象工厂类;2)具体工厂类;3)抽象产品类;4)具体产品类(可多个);
1)抽象工厂类
2)具体工厂类
3)抽象产品类
4)具体产品类
场景使用例子
四)优点
良好的封装性,代码结构清晰,降低模块间的耦合,扩展性非常优秀,
五)缺点
六)使用场景
1)需要灵活、可扩展的框架时,可以考虑采用工厂方法模式。万物皆对象,那万物就皆产品类,例子需要设计一个连接邮件服务器的框架,有三种网络协议可供选择:POP3,IMAP,HTTP,我们就可以把这三种连接方法作为产品类。如此设计,可以做到完美的扩展,如某些邮件服务器提供了WebService接口,很好,我们只要增加一个产品类就可以了。
2)不同品牌的轿车。
3)一个对象拥有很多子类。
七)注意事项
八)扩展
1)缩小为简单工厂模式(就是把抽象工厂类去掉,在create***()前面增加static关键字)
2)升级为多个工厂模式
3)替代单例模式
4)延迟初始化,例如:限制某一个产品类的最大实例化数量,可以通过判断Map中已有的对象数量来实现,这样的处理是非常有意义的,例子JDBC连接数据库,都会要求设置一个MaxConnections最大连接数量,该数量就是内存中最大实例化的数量。延迟加载还可以用在对象初始化比较复杂的情况下,例子硬件访问,涉及多方面的交互,则可以通过延迟加载降低对象的产生和销毁带来的复杂性。
九)总结
当设计灵活、可扩展的框架时,考虑使用工厂方法模式,可以完善的扩展。(扩展就是新增一个产品类)
女娲造人,创造白人,创造黑人,创造黄人。
二)定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
三)代码例子
由四部分组成: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最大连接数量,该数量就是内存中最大实例化的数量。延迟加载还可以用在对象初始化比较复杂的情况下,例子硬件访问,涉及多方面的交互,则可以通过延迟加载降低对象的产生和销毁带来的复杂性。
九)总结
当设计灵活、可扩展的框架时,考虑使用工厂方法模式,可以完善的扩展。(扩展就是新增一个产品类)