设计模式--工厂模式、简单工厂模式
设计模式--工厂模式、简单工厂模式
1.概述
1.1 定义
"Define an interface for creating an boject, but let subclasses decide which class to instantiate. Factory Method lets a clss defer instantiation to subclsses"(定义一个用于创建对象的接口,让其子类决定实例化那一个类。工厂方法使一个雷的实例化延迟到其子类)
工厂模式:提供一个工厂对象,该工厂的工厂方法接受参数(Class对象或字符串)来产生具体的产品。
简单工厂模式:提供一个一个抽象工厂,一个抽象产品。每一个具体的产品都由一个具体的工厂产生。
1.2 意义
工厂模式、简单工厂模式是典型的解耦框架,它使得对象的创建不在依赖与new关键字,而是依赖于该工厂。
1.3 应用
Spring框架中Spring就是一个大的工厂,它管理所以的Bean对象。
JDK中java.util.concurrent包中提供了ThreadFactory接口,你可以实现该接口以创建自定义的Thread。
2.详解
2.1 工厂模式
提供一个工厂对象,该工厂的工厂方法接受参数(Class对象或字符串)来产生具体的产品。
抽象产品
1 public abstract class Product { 2 public abstract void method(); 3 }
具体的产品
1 public class ProductA extends Product { 2 @Override 3 public void method() { 4 System.out.println("I am ProductA"); 5 } 6 } 7 public class ProductB extends Product { 8 @Override 9 public void method() { 10 System.out.println("I am ProductB"); 11 } 12 }
工厂对象
1 public class ProductFactory { 2 /** 3 * 通过接受参数创建相应的产品 4 * 参数可以为 Class、String、Enum 5 */ 6 public <T extends Product> T create(Class<T> c) { 7 T t = null; 8 try { 9 t = (T) Class.forName(c.getName()).newInstance(); 10 } catch (Exception e){ 11 // 异常处理 12 } 13 return t; 14 } 15 }
通过工厂创建相应的产品
1 public class Client { 2 public static void main(String[] args){ 3 ProductFactory factory = new ProductFactory(); 4 Product productA = factory.create(ProductA.class); 5 productA.method(); 6 Product productB = factory.create(ProductB.class); 7 productB.method(); 8 } 9 }output: 10 I am ProductA 11 I am ProductB
2.2 简单工厂模式
提供一个一个抽象工厂,一个抽象产品。每一个具体的产品都由一个具体的工厂产生。
抽象产品
1 public abstract class Product { 2 public abstract void method(); 3 }
具体的产品
1 public class ProductA extends Product { 2 @Override 3 public void method() { 4 System.out.println("I am ProductA"); 5 } 6 } 7 public class ProductB extends Product { 8 @Override 9 public void method() { 10 System.out.println("I am ProductB"); 11 } 12 }
抽象工厂
1 public abstract class Factory { 2 public abstract Product create(); 3 }
具体的工厂
1 public abstract class Factory { 2 public abstract Product create(); 3 } 4 public class ProductFactoryB extends Factory { 5 @Override 6 public Product create() { 7 return new ProductB(); 8 } 9 }
通过工厂创建相应的产品
1 public class Client { 2 public static void main(String[] args){ 3 Factory factoryA = new ProductAFactory(); 4 Product productA = factoryA.create(); 5 productA.method(); 6 7 Factory factoryB = new ProductBFactory(); 8 Product productB = factoryB.create(); 9 productB.method(); 10 } 11 }output: 12 I am ProductA 13 I am ProductB
3.延伸
3.1 通过工厂创建单例
1 public class SingletonFactory { 2 private static Singleton singleton; 3 static { 4 try { 5 @SuppressWarnings("unchecked") 6 Class<Singleton> c = (Class<Singleton>) 7 Class.forName(Singleton.class.getName()); 8 Constructor<Singleton> constructor = c.getDeclaredConstructor(); 9 constructor.setAccessible(true); 10 singleton = constructor.newInstance(); 11 } catch (Exception e){ 12 // 异常处理 13 } 14 } 15 public static Singleton getSingleton(){ 16 return singleton; 17 } 18 }
我们通过反射机制创建了一个单例对象。
4.应用
使用反射机制实现Spring的IOC。虽然与工厂模式没有联系,但是Spring也算是一个大工厂,只是使用Map实现的工厂,我就将就写在这里了。
我主要使用读取XML文件的方式模拟Spring,当然其中许多Spring的关键字没有实现,如factory-method等等。