工厂模式的定义
Define an interface for creating an object, but let sub let subclasses decide which class to instantiate Factory Methods lets a class defer instantiation to subclasses(定义一个用户创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化到其实例)
工厂模式类图
1.抽象产品类
public abstract class Product {
//产品类的公共方法
public void method1(){
//业务逻辑处理
}
//抽象方法
public abstract void method2();
}
2.具体产品类
public class ConcreateProduct1 extends Product {
public void method2() {
//业务逻辑处理
}
}
public class ConcreteProduct2 extends Product {
public void method2(){
}
}
3.抽象工厂类
public abstract class Creator {
//创建一个产品对象,其输入参数可以自行设置
//通常为String、Enum、Class等,当然也可以为空
public abstract <T entends Product> T createProduct(Class<T> c)
}
4.具体工厂类
public class ConcreteCreator extends Creator {
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;
}
}
5.场景类
public class Client {
public static void main(String[] args){
Creator creator = new ConcreteCreator();
Product product = creator.createProduct(ConcreteProduct1.class);
//继续业务处理
}
}
简单工厂模式(也叫静态工厂模式)
将抽象工厂类剔除,将具体工厂类的创建产品的方法变为静态
多工厂模式
不同的产品将由不同的工厂类创建
替代单例模式
1.单例类
public class Singleton {
//不允许通过new产生一个对象
private Singleton() {
}
public void doSomething() {
//业务处理
}
}
2.负责生成单例的工厂类
public class SingletonFactory {
private static Singleton signleton;
static{
try{
Class c1 = Class.forName(Singleton.class.getName());
//获得无参构造
Constructor constructor = c1.getDeclaredConstructor();
//设置无参构造是可访问的
constructor.setAccessible(true);
//产生一个实例对象
singleton = (Singleton)constructor.newInstance();
}catch (Exception e){
//异常处理
}
}
public static Singleton getSingleton(){
return singleton;
}
}