工厂相关模式有两种,分别是:
(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。
为啥一起记它俩这个模式呢,因为它俩很容易被区分,它俩最大的区别在于是产品等级和产品族的问题。例如法拉利的车和保时捷的车属于同一个产品等级,而冰箱、电视等家用产品是属于同一个产品族,小米的生态圈就可以看做是一个产品族。
工厂方法模式注重的点在产品等级,而抽象工厂注重的点是在产品族。