03、工厂模式

工厂模式可以细化三个分类:简单工厂、工厂方法、抽象工厂。

1、简单工厂

简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知道产品类所对应的参数即可。但是工厂的职责过重,而且当类型过多时不利于系统的扩展维护。

代码案例

文件01:Car.java

package cn.itchao.factory.simple;

public interface Car {
    void run();
}

文件02:BydCar.java

package cn.itchao.factory.simple;

public class BydCar implements Car {
    @Override
    public void run() {
        System.out.println("制造一台比亚迪汽车");
    }
}

文件03:AuDiCar.java

package cn.itchao.factory.simple;

public class AuDiCar implements Car{
    @Override
    public void run() {
        System.out.println("制造一台奥迪汽车");
    }
}

文件04:CarFactory.java

package cn.itchao.factory.simple;

public class CarFactory {
    public static Car newCar(String name){
        if(null==name||"".equals(name)){
            return null;
        }
        if("比亚迪".equals(name)){
            return new BydCar();
        }
        if("奥迪".equals(name)){
            return new AuDiCar();
        }
        return null;
    }
}

测试代码:

package cn.itchao.factory.simple;

public class Test01 {
    public static void main(String[] args) {
        Car BydCar = CarFactory.newCar("比亚迪");
        Car AuDiCar = CarFactory.newCar("奥迪");
        BydCar.run();
        AuDiCar.run();
    }
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/lib/tools.jar:/local/idea_work/study/itchao-design-mode/target/classes cn.itchao.factory.simple.Test01
制造一台比亚迪汽车
制造一台奥迪汽车

Process finished with exit code 0

总结:

        优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

        缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则。

2、工厂方法

   工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

代码案例:

(1)、创建抽象工厂类,定义具体工厂的公共接口

package cn.itchao.factory.method;

abstract class AbstractFactory {
    //定义一个抽象的 "制造方法"
    public abstract AbstractProduct manufacture();
}

(2)、 创建抽象产品类 ,定义具体产品的公共接口

package cn.itchao.factory.method;

abstract class AbstractProduct {
    public abstract void show();
}

(3)、创建具体产品类(继承抽象产品类), 定义生产的具体产品

package cn.itchao.factory.method;
/**
 * @Description:具体的奥迪汽车生产类
 */
public class AuDiCar extends AbstractProduct {
    @Override
    public void show() {
        System.out.println("生产一台奥迪汽车");
    }
}
package cn.itchao.factory.method;
/**
 * @Description:具体的比亚迪汽车生产类
 */
public class BydCar extends AbstractProduct {
    @Override
    public void show() {
        System.out.println("生产一台比亚迪汽车");
    }
}

(4)、创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法

package cn.itchao.factory.method;
/**
 * @Description:比亚迪工厂类生产比亚迪汽车
 */
public class BydFactory extends AbstractFactory {
    @Override
    public AbstractProduct manufacture() {
        return new BydCar();
    }
}
package cn.itchao.factory.method;
/**
 * @Description:奥迪工厂类生产奥迪汽车
 */
public class AuDiFactory extends AbstractFactory {
    @Override
    public AbstractProduct manufacture() {
        return new AuDiCar();
    }
}

(5)、外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

package cn.itchao.factory.method;

public class Test01 {
    public static void main(String[] args) {
        //客户需要比亚迪汽车
        BydFactory bydFactory = new BydFactory();
        bydFactory.manufacture().show();
        //客户需要奥迪汽车
        AuDiFactory auDiFactory = new AuDiFactory();
        auDiFactory.manufacture().show();
    }
}

测试结果:

总结:

  优点:
    (1)更符合开-闭原则,新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可,
         简单工厂模式需要修改工厂类的判断逻辑

     (2)符合单一职责原则 ,每个具体工厂类只负责创建对应的产品,
         简单工厂中的工厂类存在复杂的switch逻辑判断或者if判断
     (3)不使用静态工厂方法,可以形成基于继承的等级结构,
         简单工厂模式的工厂类使用静态工厂方法
     工厂方法模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现

3、抽象工厂

上面提到的工厂方法存在一个严重的不足之处,一个具体的工厂只能创建一类产品,而在实际工作中往往一个工厂需要生产多类产品,为了解决这个不足之处,所以我们又有一种新的设计模式:抽象工厂模式

定义:抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例

作用:允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。

代码案例:

(1)、创建抽象工厂类,定义具体工厂的公共接口

参考:https://blog.csdn.net/carson_ho/article/details/54910287

  

猜你喜欢

转载自my.oschina.net/shxjinchao/blog/1806186