美文网首页
工厂模式

工厂模式

作者: jianshujoker | 来源:发表于2020-03-01 14:49 被阅读0次

    工厂模式是用来创建对象的,当我们创建的对象比较简单时,我们大可以直接new一个;但当创建的对象比较复杂时,或涉及大量重复代码时,就可以使用工厂模式来创建对象了;下面以电器产品为例,看下三种工厂模式的异同

    简单工厂模式

    工厂对象决定创建哪个对象实例,不属于GOF的23种设计模式

    public class SimpleFactory {
        /**
         * @param firm 厂商
         * @return 空调产品
         */
        IAirConditioner getAirConditioner(String firm) {
            if ("changhong".equalsIgnoreCase(firm)) {
                return new ChangHongAirConditioner();
            } else if ("meidi".equalsIgnoreCase(firm)) {
                return new MeiDiAirConditioner();
            } else {
                return null;
            }
        }
    }
    

    当我们想要获得一个空调产品时,我们只需要调用getAirConditioner就能得到产品,而无需关注创建过程,它的类图


    简单工厂.png
    • 缺点:不利于扩展,当需要创建的产品变多变复杂,代码会变得臃肿庞大

    工厂方法模式

    定义一个创建对象的接口,让实现接口的子类来创建对象

    public interface IFactory {
        IAirConditioner create();
    }
    
    public class ChangHongAirConditionerFactory implements IFactory {
        @Override
        public IAirConditioner create() {
            return new ChangHongAirConditioner();
        }
    }
    
    public class MeiDiAirConditionerFactory implements IFactory {
        @Override
        public IAirConditioner create() {
            return new MeiDiAirConditioner();
        }
    }
    
    工厂方法.png
    • 适用于:创建的产品较复杂有差异化,需要扩展
    • 缺点:类个数变多,增加了复杂度

    抽象工厂模式

    提供创建一系列相关或相互依赖产品(它们都有一个共有属性,比如这里的电器都是属于同一个厂商)的接口,不指定具体的类

    public abstract class AbstractElectricFactory {
        public abstract IAirConditioner createAirConditioner();
    
        public abstract ITv createTV();
    }
    
    public class ChangHongElectricFactory extends AbstractElectricFactory {
        @Override
        public IAirConditioner createAirConditioner() {
            return new  ChangHongAirConditioner();
        }
    
        @Override
        public ITv createTV() {
            return new ChangHongTV();
        }
    }
    
    public class MeiDiElectricFactory extends AbstractElectricFactory {
        @Override
        public IAirConditioner createAirConditioner() {
            return new MeiDiAirConditioner();
        }
    
        @Override
        public ITv createTV() {
            return new MeiDiTV();
        }
    }
    

    类图


    抽象工厂.png
    • 适用于:创建一系列相关或相互依赖的产品
    • 缺点:增加复杂度

    相关文章

      网友评论

          本文标题:工厂模式

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