设计模式之工厂方法模式

工厂方法模式的定义:

Define an interface for creating an object,but let subclasses decide which class to instaniate.Factory Method lets a class defer instantiation to subclasses.

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法让一个类的实例化延迟到其子类。与简单工厂方法模式相比,在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是具体创建的工作交给子类去做。这个核心类成为了一个抽象工厂类,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

下面是工厂方法模式的示例代码。代码所在的包名为“工厂方法模式”。

Product.java:

package 工厂方法模式;

/**
 * 抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。 
 * @author AHAN
 *
 */
public abstract class Product {
    
    //抽象方法
    public abstract void method();
    
}

Creator.java:

package 工厂方法模式;

/**
 * 抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。
 * @author AHAN
 *
 */
public abstract class Creator {
    //创建一个产品对象,其输入参数类型可自行设置
    //通常为String、Enum、Class等,当然也可以为空
    public abstract <T extends Product> Product FactoryMethod(Class<T> c);
}

ConcreteProduct.java:

package 工厂方法模式;

/**
 * 具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
 * @author AHAN
 *
 */
public class ConcreteProduct extends Product {
    @Override
    public void method() {
        System.out.println("这是具体产品的方法");
    }

}

ConcreteCreator.java:

package 工厂方法模式;

/**
 * 具体工厂(Concrete
 * Creator)角色:担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
 * 
 * @author AHAN
 * 
 */
public class ConcreteCreator extends Creator {
    @Override
    public <T extends Product> Product FactoryMethod(Class<T> c) {
        try {
            Product product = (Product) Class.forName(c.getName())
                    .newInstance();
            return product;
        } catch (Exception e) {
            // 异常处理
            return null;
        }
    }
}

Client.java:

package 工厂方法模式;

/**
 * 客户端
 * @author AHAN
 *
 */
public class Client {

    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();
        Product product = creator.FactoryMethod(ConcreteProduct.class);
        product.method();
    }

}

可以根据情况升级为多个工厂类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容