美文网首页
设计模式之工厂方法模式

设计模式之工厂方法模式

作者: Andy周 | 来源:发表于2016-07-28 00:05 被阅读16次

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

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

    相关文章

      网友评论

          本文标题:设计模式之工厂方法模式

          本文链接:https://www.haomeiwen.com/subject/jbxajttx.html