乐趣区

关于java:设计模式之工厂模式

工厂模式:

当创立逻辑比较复杂时,就能够思考应用工厂模式,封装对象的创立过程,将对象的创立和应用相拆散。

工厂模式,属于创立类型

理论代码我放在了 Github: https://github.com/liangtengy…

利用场景:

学习一个设计模式之前 咱们先理解它的应用场景可能帮咱们更快的了解它,
绝对于间接 new 来创建对象,用工厂模式来创立到底有什么益处呢?

次要有两种状况:

  • 第一种状况是相似规定配置解析的例子,代码中存在 if-else 分支判断,动静的依据不同的类型创立不同的对象。针对这种状况,咱们就能够思考应用工厂模式,将这一大块的 if-else 创建对象的代码抽离进去,放到工厂类中。
  • 还有一种状况是,只管咱们不须要依据不同的类型创立不同的对象,然而,单个对象自身的创立过程比较复杂,咱们也能够思考应用工厂模式。

益处: 因为工厂模式是依附形象架构的,它把实例化产品的工作交由实现类实现,扩展性比拟好。也就是说,当须要零碎有比拟好的扩展性时,能够思考工厂模式,不同的产品用不同的实现工厂来组装。艰深的讲就是升高代码扭转对产品性能的影响.

实现形式:

简略工厂(Simple Factory)

首先,咱们来看,什么是简略工厂模式。咱们通过一个例子来解释一下。

简略工厂模式

public class Cocacola implements Cola {public String getCola() {return "可口可乐";}
}
public class ColaFactory {public static Cola getInstance(Integer  colaType) {if (1 == colaType) {return new Cocacola();
        } else if (2 == colaType) {return new Pepsicola();
        } else {return new Fakecola();
        }
    }

}
 public static void main(String[] args) {String drink = ColaFactory.getInstance(1).drink();
        System.out.println(drink);
    }
    // 可口可乐

只管简略工厂模式的代码实现中,有多处 if 分支判断逻辑,违反开闭准则,但衡量扩展性和可读性,这样的代码实现在大多数状况下是没有问题的。

工厂办法(Factory Method)

工厂办法是简略工厂的进一步的延长,这样说是因为简略工厂违反了开闭准则,而此时工厂办法却能够完满的解决这个问题!接下来看看它是怎么解决的吧!

工厂办法 – 我的项目

对于规定配置文件解析这个利用场景来说,工厂模式须要额定创立诸多 Factory 类,也会减少代码的复杂性,而且,每个 Factory 类只是做简略的 new 操作,性能十分薄弱(只有一行代码),也没必要设计成独立的类,所以,在这个利用场景下,简略工厂模式 好用,比 工厂办法模式 更加适合

public interface ColaFactory {// 工厂接口
    Cola getCola();}
public class CocaColaFactoryImpl implements ColaFactory {// 实现可口可乐工厂
    public Cola getCola() {return  new Cocacola();
    }
}
public static void main(String[] args) {
    // 工厂办法须要一个可乐时, 间接去对应的工厂拿, 而是不像简略工厂那样 都是从一个工厂中依据判断来拿
    // 每一种可乐都对应一个工厂
    ColaFactory pepsiColaFactory = new PepsiColaFactoryImpl();
    Cola cola = pepsiColaFactory.getCola();
    cola.getCola();}

什么时候该用工厂办法模式,而非简略工厂模式呢?

​ 之所以将某个代码块剥离进去,独立为函数或者类,起因是这个代码块的逻辑过于简单,剥离之后能让代码更加清晰,更加可读、可保护。

​ 然而,如果代码块自身并不简单,就几行代码而已,咱们齐全没必要将它拆分成独自的函数或者类。基于这个设计思维,当对象的创立逻辑比较复杂,不只是简略的 new 一下就能够,而是要组合其余类对象,做各种初始化操作的时候,咱们举荐应用工厂办法模式,将简单的创立逻辑拆分到多个工厂类中,让每个工厂类都不至于过于简单。而应用简略工厂模式,将所有的创立逻辑都放到一个工厂类中,会导致这个工厂类变得很简单。

​ 除此之外,在某些场景下,如果对象不可复用,那工厂类每次都要返回不同的对象。如果咱们 应用简略工厂模式来实现 就只能抉择第一种蕴含 if 分支逻辑的实现形式。如果咱们还想防止烦人的 if-else 分支逻辑,这个时候,咱们就举荐应用工厂办法模式。

形象工厂(Abstract Factory)

形象工厂模式的利用场景比拟非凡,没有前两种罕用,咱们简略理解一下

简略工厂只是对可乐产品进行了形象, 工厂办法是对可乐工厂进行形象, 形象工厂是对工厂办法的再次形象

光从概念可能不好了解, 咱们来个实例

需要: 当初产品线调整了, 咱们生产的可乐 尽管有各自的品牌然而都是通明瓶子, 咱们要做出本人的特点. 须要给不同品牌的可乐喷涂不同的色彩瓶身.

思考: 如果此时咱们将可乐的生产和色彩的喷涂都耦合在工厂办法的代码中, 后续调整会很麻烦, 也违反了开闭准则, 对拓展凋谢, 对批改敞开, 那么此时咱们应用形象工厂就比拟适合了

public abstract class ColaAbstractFactory {// 创立形象工厂类
    abstract ColaFactory getCola(String cola);
    abstract ColorFactory getColor(String color);
}
public class ColaAbstractFactoryImpl extends ColaAbstractFactory {

        // 实现抽象类
   public ColaFactory getCola(String cola) {if ("cocacola".equals(cola)) {return new CocaColaFactoryImpl();
        } else if ("fake".equals(cola)) {return new FakeColaFactoryImpl();
        } else if ("pepsi".equals(cola)) {return new PepsiColaFactoryImpl();
        } else
            return null;
    }

    public ColorFactory getColor(String color) {if ("yellow".equals(color)) {return new YellowColorFactoryImpl();
        } else if ("blue".equals(color)) {return new BlueColorFactoryImpl();
        } else if ("red".equals(color)) {return new RedColorFactoryImpl();
        } else
            return null;
    }
}
public class RedColorFactoryImpl implements ColorFactory {// 对不同色彩的需要进行喷涂. 其它色彩相似就不反复贴了
    public String getColor() {System.out.println("喷涂红色瓶身");
        return "红色瓶子";
    }
}

最终咱们想要取得可乐 + 红色瓶身

public static String getColaAndColor(String cola,String color){ColaAbstractFactoryImpl colaAbstractFactory = new ColaAbstractFactoryImpl();

    ColaFactory cola = colaAbstractFactory.getCola(cola);
    ColorFactory red = colaAbstractFactory.getColor(color);

    Cola col = cola.getCola();
    String colo = red.getColor();
    return col.getCola()+"-"+colo;}
public static void main(String[] args) {String colaAndColor = FactoryProducer.getColaAndColor("cocacola", "red");
    System.out.println(colaAndColor);

}
//output:
喷涂红色
生产可口可乐
可口可乐 - 红色瓶子

关注公众号:java 宝典

退出移动版