工厂方法模式具有良好的封装性,可以有效降低模块间的耦合,应用场景,比如有多种网络协议:POP3,IMAP,HTTP,这个时候就可以把这三种连接方法作为产品类,定义一个IConnectMail接口
定义一个用于创建对象的接口,让子类决定实例化哪一个类
通用工厂方法模式
首先定义通用的接口
package cn.byhook.design.factory.impl;
/**
* 作者: Andy
* 时间: 2016-07-27
* 产品接口
*/
public interface IProduct {
/**
* 重量
*/
void price();
/**
* 名称
*/
void name();
}
具体的产品类
/**
* 作者: Andy
* 时间: 2016-07-27
*/
public class Book implements IProduct {
@Override
public void price() {
System.out.println("10元");
}
@Override
public void name() {
System.out.println("Book...");
}
}
以及
/**
* 作者: Andy
* 时间: 2016-07-27
*/
public class Phone implements IProduct {
@Override
public void price() {
System.out.println("5000元");
}
@Override
public void name() {
System.out.println("Phone...");
}
}
抽象工厂类
/**
* 作者: Andy
* 时间: 2016-07-27
* 抽象工厂模式
* 这里定义泛型并对参数加以限制
*/
public abstract class AbsProductFactory {
public abstract <T extends IProduct> T create(Class<T> cls);
}
具体的工厂类
/**
* 作者: Andy
* 时间: 2016-07-27
*/
public class ProductFactory extends AbsProductFactory {
@Override
public <T extends IProduct> T create(Class<T> cls) {
IProduct iProduct = null;
try {
iProduct = (T) Class.forName(cls.getName()).newInstance();
} catch (Exception e) {
System.out.println("Create Product Error ...");
}
return (T) iProduct;
}
}
使用场景
public static void main(String[] args) {
AbsProductFactory factory = new ProductFactory();
//造本书
Book book = factory.create(Book.class);
book.name();
book.price();
//造手机
Phone phone = factory.create(Phone.class);
phone.name();
phone.price();
}
工厂方法模式的扩展
1.简单工厂模式
一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态方法就可以了
/**
* 作者: Andy
* 时间: 2016-07-27
*/
public class SimpleFactory {
public static <T extends IProduct> T create(Class<T> cls){
IProduct iProduct = null;
try {
iProduct = (T) Class.forName(cls.getName()).newInstance();
} catch (Exception e) {
System.out.println("Create Animal Error ...");
}
return (T) iProduct;
}
}
使用场景
public static void main(String[] args) {
//造本书
Book book = SimpleFactory.create(Book.class);
book.name();
book.price();
//造手机
Phone phone = SimpleFactory.create(Phone.class);
phone.name();
phone.price();
}
这种模式称为简单工厂模式,也叫静态工厂模式
网友评论