设计模式之工厂方法模式

2016-07-28  本文已影响16人  Andy周

工厂方法模式具有良好的封装性,可以有效降低模块间的耦合,应用场景,比如有多种网络协议: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();

    }

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

上一篇下一篇

猜你喜欢

热点阅读