复习简单工厂模式:

简单工厂模式中有一个核心的工厂类,这个工厂类位于产品实例化的中心位置,(需要知道产品类的具体实现细节,并决定何时实例化哪一个产品类)以上图为例说明:
我们的生产线一给有A,B两条。核心的工厂类就是富士康工厂,负责根据不同客户的具体需求(传递的参数),启动不同的产品类,来生产对应的产品(实例对象),来将产品提供给客户。如果客户喜欢国产手机,富士康就启动华为工厂,生产华为手机,将手机提供给用户。而用户不用关心手机是怎样生产制造的,用了哪些零件,只需要提供自己的需求,由工厂来实现其中的具体步骤,用户拿到最终需要的手机即可。
每当我们有新的需求,物美价廉,需要制造新的的产品的时候,只需要引入新的的产品工厂类,修改核心工厂类 ,虽然不需要对之前的操作该对,(违反了开闭原则)。此时我们引入小米工厂加入富士康工厂,让小米工厂生产产品C小米手机,提供给用户,而对华为生产线和苹果生产线没有影响。
1.简述—是什么?
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。 工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
专业:
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
2.介绍—为什么使用?
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:
- 在实例化对象的时候不是简单的new对象,调用构造方法,而同时附带一系列复杂的操作时;
- 我们在new simple()对象时,随着业务推进会有子类MySimple(),HisSimple(),HerSimple()等一系列实例对象,在我们后续修改simple()时,其子类也要随之修改。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
3.过程—什么原理?
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,其UML类图如下:
之前的核心工厂变成一个抽象工厂,其定义了产品的生产接口方法,但不负责具体的产品,将生产任务交给不同的派生类工厂**而不是通过核心工厂类来实例化对象。即子类负责生成具体的产品对象。这样将产品的实例化操作延迟到工厂子类中来完成,也就是通过工厂子类来确定究竟来具体实例化哪一个产品对象。这样不用通过指定类型来创建对象了。
接下来继续使用生产手机的例子来讲解该模式。
这里我们不需要富士康工厂来为我们生产手机,而是定义了生产对象的方法,由每一个产品工厂类实现具体方法,生产自己的手机。**我们只要新建小米工厂,实现抽象工厂的生产方法,来自己生产小米手机。
4.入门案例
AbstractFactory类:生产不同产品的工厂的抽象类、
public interface AbstractFactory {Phone makePhone();}
HuaWeiFactory类:生产华为手机的工厂(ConcreteFactory1)
public class HuaWeiFactory implements AbstractFactory{@Overridepublic Phone makePhone() {return new HuaweiPhone();}}
AppleFactory类:生产苹果手机的工厂(ConcreteFactory2)
public class AppleFactory implements AbstractFactory {@Overridepublic Phone makePhone() {return new IPhone();}}
引入:XiaoMiFactory类:生产小米手机的工厂(ConcreteFactory3)
public class XiaoMiFactory implements AbstractFactory{@Overridepublic Phone makePhone() {return new MiPhone();}}
实现:
public class Demo {public static void main(String[] arg) {AbstractFactory huaweiFactory = new HuaWeiFactory();AbstractFactory appleFactory = new AppleFactory();huaweiFactory.makePhone(); // make Huawei phone!appleFactory.makePhone(); // make iphone!AbstractFactory miFactory = new XiaoMiFactory();miFactory.makePhone(); // make xiaomi phone!}}
