设计模式——通过简单工厂模式推出工厂方法模式

Posted 爱Java的程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——通过简单工厂模式推出工厂方法模式相关的知识,希望对你有一定的参考价值。

工厂模式简介

工厂模式,是通过一个工厂来进行创建对象的,我们不用去new对象了,而是直接在工厂中get对象。但是,这样做的好处是什么呢?

实现了解耦,也就是把创建对象和使用对象进行了分离。

简单工厂模式

简单工厂模式,我们通过一个车工厂,来进行讲解,首先我们有一个车的接口,这里面有着车的共有的方法,例如每一辆车都有自己的品牌也就是name等。

public interface Car { public void name();}

这样我们可以通过不同的车来实现这个类,并重写这个方法,来获得自己车的名字,我们这里通过奥迪汽车和宝马汽车这两个类来实现。

public class AoDi implements Car { @Override public void name() { System.out.println("奥迪"); }}
public class BaoMa implements Car { @Override public void name() { System.out.println("宝马"); }}

有了两个车的实现类了,那么我们的工厂就可以出来了,来一个车的工厂类,用来get奥迪和宝马。

public class CarFactory { public static Car getAoDi() { return new AoDi(); }
public static Car getBenChi() { return new BaoMa(); }}

下面进行测试

public class Main { public static void main(String[] args) { Car aoDi = CarFactory.getAoDi(); Car BaoMa= CarFactory.getBaoMa();  aoDi.name(); //奥迪 BaoMa.name(); //宝马 }}

工厂方法模式

上面的例子看似没有任何的问题,但是,当我们又来了一辆奔驰车,我们需要写一个奔驰车的类来实现车接口,这也没毛病,但是,我们还需要去修改我们的车工厂,需要在里面加上一个getBenChi()方法,对类进行修改就违背了开闭原则。所以就有了工厂方法模式,增强了程序的可扩展性。

工厂方法模式的思想也是通过工厂来制造汽车,但是这个工厂不是一个类了,而是一个接口,用来获取汽车getCar(),奥迪、宝马、奔驰,只需要去实现该接口重写getCar()方法,来真正的制造出对应的车,相当于是奥迪小工厂来加工奥迪汽车,宝马小工厂加工宝马汽车,奔驰小工厂加工奔驰汽车。

首先我们也是需要一个Car的接口,里面还是封装了车共有的东西。

public interface Car { public void name();}

接下来还是车去实现这些接口,这里我们先用奥迪和宝马,好体现出扩展性。

public class AoDi implements Car { @Override public void name() { System.out.println("奥迪"); }}
public class BaoMa implements Car { @Override public void name() { System.out.println("宝马"); }}

然后是一个车工厂,这个车工厂是一个接口,用来制造汽车(不特指某一类),只负责getCar()。

public interface CarFactory { public Car getCar();}

此时,我们的奥迪小工厂用来制造奥迪,宝马小工厂用来制造宝马,只需去实现这个接口重写getCar()方法即可。

public class AoDiFactory implements CarFactory { @Override public Car getCar() { return new AoDi(); }}
public class BaoMaFactory implements CarFactory { @Override public Car getCar() { return new BaoMa(); }}

那么,当我们需要某一款车对象的时候,只需创建该车工厂的对象,直接getCar就行了。

public class Main { public static void main(String[] args) { Car aoDi = new AoDiFactory().getCar(); Car baoMa = new BaoMaFactory().getCar();  aoDi.name(); //奥迪 baoMa.name(); //宝马 }}

而当我们想要扩展一辆奔驰车时,我们只需要一个奔驰类实现Car接口,然后一个宝马工厂去实现车工厂的接口即可

public class BenChi implements Car { @Override public void name() { System.out.println("奔驰"); }}
public class BenChiFactory implements CarFactory { @Override public Car getCar() { return new BenChi(); }}

下面进行测试

public class Main { public static void main(String[] args) { Car aoDi = new AoDiFactory().getCar(); Car baoMa = new BaoMaFactory().getCar(); Car benChi = new BenChiFactory().getCar();  aoDi.name(); //奥迪 baoMa.name(); //宝马 benChi.name(); //奔驰 }}

通过这么一波操作之后,我们似乎感觉,简单工厂模式是一个大工厂(类)里面可以制造各种各样的车,当需要扩展的时候,是对这个大工厂(类)进行扩展,需要修改具体的类。工厂方法模式是一个大工厂(接口)里面有很多的小工厂,各自的小工厂负责各自的事情,当需要扩展的时候,是对大工厂(接口)进行扩展。这样一来,就不用修改某一个类了,只需要实现接口就行。

以上是关于设计模式——通过简单工厂模式推出工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

带领大家一起进“厂”Java简单工厂+工厂方法+抽象工厂

带领大家一起进“厂”Java简单工厂+工厂方法+抽象工厂

简单工厂模式(静态工厂方法模式)