设计模式-工厂模式

1802 查看

工厂模式的定义

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;
    }
}