工廠方法模式具有良好的封裝性,可以有效降低模塊間的耦合,應用場景,比如有多種網絡協議: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();
}
這種模式稱為簡單工廠模式,也叫靜態工廠模式