zoukankan      html  css  js  c++  java
  • 设计模式--工厂模式、简单工厂模式


     

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

     

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

  • 相关阅读:
    ipad mini2 ios7 磁盘分析文件夹大小
    Qt设置horizontal line 和vertical line 的颜色
    剖析QMenu & Qt完全定制化菜单
    Django--Auth 模块
    Django --ORM常用的字段和参数 多对多创建形式
    Django--Ajax 提交
    Django--CSRF 跨站请求伪造
    Django--Session 操作
    css
    pycharm格式化代码 常用快捷键
  • 原文地址:https://www.cnblogs.com/maying3010/p/6546068.html
Copyright © 2011-2022 走看看