【设计模式-工厂相关模式】
工厂相关模式有两种,分别是:
(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。
为啥一起记它俩这个模式呢,因为它俩很容易被区分,它俩最大的区别在于是产品等级和产品族的问题。例如法拉利的车和保时捷的车属于同一个产品等级,而冰箱、电视等家用产品是属于同一个产品族,小米的生态圈就可以看做是一个产品族。
工厂方法模式注重的点在产品等级,而抽象工厂注重的点是在产品族。
=======================================================
我是Liusy,一个喜欢健身的程序员。
欢迎关注微信公众号【Liusy01】,一起交流Java技术及健身,获取更多干货,领取Java进阶干货,一起成为Java大神。
来都来了,关注一波再溜呗。