设计模式--工厂模式、简单工厂模式


 

设计模式--工厂模式、简单工厂模式

 

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等等。

 

posted @ 2017-03-14 01:08  默默的看雨下  阅读(148)  评论(0编辑  收藏  举报