定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类.
优点:
1. 良好的封装性,代码结构清晰
2. 扩展性优秀
3. 屏蔽产品类
4. 解耦
通用源码:
抽象产品类
public abstract class Product {
public abstract void method();
}
具体产品类
public class ConcreteProduct1 extends Product {
@Override
public void method() {
}
}
public class ConcreteProduct2 extends Product {
@Override
public void method() {
}
}
抽象工厂类
public abstract class Creator {
public abstract <T extends Product> T createProduct(Class<T> c);
}
具体工厂类
public class ConcreteCreator extends Creator {
@Override
public <T extends Product> T createProduct(Class<T> c) {
Product product = null;
try{
product = (Product)Class.forName(c.getName()).newInstance();
}catch(Exception e){
}
return (T) product;
}
}
简单工厂模式
实现:
1. 去掉抽象工厂类
2. 在具体工厂类create前添加static关键字
缺点:
1. 扩展比较困难
2. 不符合开闭原则
优点:
1.比较简单
源码:
public class ConcreteCreator {
public static <T extends Product> T createProduct(Class<T> c) {
Product product = null;
try{
product = (Product)Class.forName(c.getName()).newInstance();
}catch(Exception e){
}
return (T) product;
}
}
结合单例
单例类
public class Singleton {
private Singleton() {
}
}
单例工厂类
public class SingletonFactory {
private static Singleton singleton;
static {
try {
Class c = Class.forName(Singleton.class.getName());
Constructor constructor = c.getDeclaredConstructor();
constructor.setAccessible(true);
singleton = (Singleton) constructor.newInstance();
} catch (Exception e) {
}
}
public static Singleton getSingleton() {
return singleton;
}
}
延迟加载的工厂类
public class ProductFactory {
private static Map<String,Product> map = new HashMap<String,Product>();
public static Product createProduct(String name) {
Product product = null;
if (map.containsKey(name)) {
return map.get(name);
}else{
if ("ConcreteProduct1".equals(name)) {
product = new ConcreteProduct1();
}else{
product = new ConcreteProduct2();
}
}
return product;
}
}