【设计模式-工厂相关模式】

时间:2022-07-24
本文章向大家介绍【设计模式-工厂相关模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

工厂相关模式有两种,分别是:

(1)工厂方法模式

(2)抽象工厂模式

接下来分别说下这两种工厂模式:

一、工厂方法模式

(1)定义:

定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

其实就是专职专产,比如某条产品线就只生产一种产品。

(2)实例:

比如车辆厂商有保时捷、法拉利等,他们的厂就专门生产一种品牌的车,这是就会有两个抽象的对象,一个是车,一个是厂,什么厂就生产什么样的车。

车对象:

1、车的抽象对象
public abstract class Car {
    public abstract void produce();
}
2、法拉利
public class FerrariCar extends Car {
    @Override
    public void produce() {
        System.out.println("生产一台法拉利");
    }
}
3、保时捷
public class PorscheCar extends Car {
    @Override
    public void produce() {
        System.out.println("生产一台保时捷");
    }
}

厂对象:

1、厂的抽象对象 
public abstract class CarFactory {
    public abstract Car getCar();
}
2、法拉利厂--专产法拉利车
public class FerrariFactory extends CarFactory {
    @Override
    public Car getCar() {
        return new FerrariCar();
    }
}
3、保时捷厂--专产保时捷车
public class PorscheFactory extends CarFactory {
    @Override
    public Car getCar() {
        return new PorscheCar();
    }
}

测试类:

public class Main {
    public static void main(String[] args) {
        CarFactory  carFactory = new FerrariFactory();
        Car car = carFactory.getCar();
        car.produce();
    }
}

测试结果:

它们之间的类图如下:

如果想要在生产其他车,只需要分别创建一个车的子类和厂的子类即可,扩展性较强。

(3)源码实例

在jdk的sun.rmi.runtime包下的LogFactory和Log

二、抽象模式

(1)定义:

提供一个创建一系列相关或相互依赖对象的接口,无需指定他们具体的类。

其实就是一个生态,比如小米生态,小米工厂里面可以生产一系列产品,手机、路由器等。

(2)实例:

比如家用电器厂商有美的、格力等,他们都可以生产电视,洗衣机等家用电器。这里就有两个对象,一个是厂商,一个是家用电器。

家用电器:

1、家用电器抽象类
public abstract class HouseHold {
    void produce(){};
}
2、电视类
public class Television  extends HouseHold{
    @Override
    public void produce(){
        System.out.println("获取一台电视");
    }
}
3、洗衣机
public class Washer extends HouseHold{
    @Override
    public void produce(){
        System.out.println("获取一台洗衣机");
    }
}

厂商:

1、抽象厂商--可以获取电视、洗衣机
public interface HouseholdFactory {
    /**
     * 获取电视
     */
    Television getTelevision();
    /**
     * 获取洗衣机
     */
    Washer getWasher();
}
2、美的厂商
public class MediaFactory implements HouseholdFactory {
    @Override
    public Television getTelevision() {
        return new Television();
    }
    @Override
    public Washer getWasher() {
        return new Washer();
    }
}
3、格力厂商
public class GreeFactory implements HouseholdFactory {
    @Override
    public Television getTelevision() {
        return null;
    }
    @Override
    public Washer getWasher() {
        return null;
    }
}

测试类:需要获取美的的电视和冰箱

public static void main(String[] args) {
    HouseholdFactory householdFactory = new MediaFactory();
    Television television = householdFactory.getTelevision();
    Washer washer = householdFactory.getWasher();
    television.produce();
    washer.produce();
}

结果:

这几个类的类图如下:

(3)源码实例:类似与一个接口中可以返回不同的类。

比如Mybatis的SqlSession中可以返回Configuration,也可以返回Connection。

为啥一起记它俩这个模式呢,因为它俩很容易被区分,它俩最大的区别在于是产品等级和产品族的问题。例如法拉利的车和保时捷的车属于同一个产品等级,而冰箱、电视等家用产品是属于同一个产品族,小米的生态圈就可以看做是一个产品族。

工厂方法模式注重的点在产品等级,而抽象工厂注重的点是在产品族。