欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式之工厂方法模式

程序员文章站 2024-01-05 17:19:10
...

工厂方法模式具有良好的封装性,可以有效降低模块间的耦合,应用场景,比如有多种网络协议:POP3,IMAP,HTTP,这个时候就可以把这三种连接方法作为产品类,定义一个IConnectMail接口

定义一个用于创建对象的接口,让子类决定实例化哪一个类

通用工厂方法模式

首先定义通用的接口

package cn.byhook.design.factory.impl;

/**
 * 作者: Andy
 * 时间: 2016-07-27
 * 产品接口
 */
public interface IProduct {

    /**
     * 重量
     */
    void price();

    /**
     * 名称
     */
    void name();
}

具体的产品类

/**
 * 作者: Andy
 * 时间: 2016-07-27
 */
public class Book implements IProduct {

    @Override
    public void price() {
        System.out.println("10元");
    }

    @Override
    public void name() {
        System.out.println("Book...");
    }
}

以及

/**
 * 作者: Andy
 * 时间: 2016-07-27
 */
public class Phone implements IProduct {

    @Override
    public void price() {
        System.out.println("5000元");
    }

    @Override
    public void name() {
        System.out.println("Phone...");
    }
}

抽象工厂类

/**
 * 作者: Andy
 * 时间: 2016-07-27
 * 抽象工厂模式
 * 这里定义泛型并对参数加以限制
 */
public abstract class AbsProductFactory {
     public abstract <T extends IProduct> T create(Class<T> cls);
}

具体的工厂类

/**
 * 作者: Andy
 * 时间: 2016-07-27
 */
public class ProductFactory extends AbsProductFactory {

    @Override
    public <T extends IProduct> T create(Class<T> cls) {

        IProduct iProduct = null;
        try {
            iProduct = (T) Class.forName(cls.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("Create Product Error ...");
        }
        return (T) iProduct;
    }

}

使用场景

public static void main(String[] args) {

        AbsProductFactory factory = new ProductFactory();

        //造本书
        Book book = factory.create(Book.class);
        book.name();
        book.price();

        //造手机
        Phone phone = factory.create(Phone.class);
        phone.name();
        phone.price();

    }

工厂方法模式的扩展

1.简单工厂模式
一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态方法就可以了

/**
 * 作者: Andy
 * 时间: 2016-07-27
 */
public class SimpleFactory {
    public static  <T extends IProduct> T create(Class<T> cls){
        IProduct iProduct = null;
        try {
            iProduct = (T) Class.forName(cls.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("Create Animal Error ...");
        }
        return (T) iProduct;
    }
}

使用场景

public static void main(String[] args) {

        //造本书
        Book book = SimpleFactory.create(Book.class);
        book.name();
        book.price();

        //造手机
        Phone phone = SimpleFactory.create(Phone.class);
        phone.name();
        phone.price();

    }

这种模式称为简单工厂模式,也叫静态工厂模式