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(定义一个用户建立对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化到其实例)ide
工厂模式类图
1.抽象产品类spa
public abstract class Product { //产品类的公共方法 public void method1(){ //业务逻辑处理 } //抽象方法 public abstract void method2(); }
2.具体产品类code
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.场景类ci
public class Client { public static void main(String[] args){ Creator creator = new ConcreteCreator(); Product product = creator.createProduct(ConcreteProduct1.class); //继续业务处理 } }
将抽象工厂类剔除,将具体工厂类的建立产品的方法变为静态get
不一样的产品将由不一样的工厂类建立产品
1.单例类io
public class Singleton { //不容许经过new产生一个对象 private Singleton() { } public void doSomething() { //业务处理 } }
2.负责生成单例的工厂类class
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; } }