一、引入工厂模式
假如我们有一个手机接口里面有一个打电话方法(call),它有两个实现类小米手机和华为手机。我们现在要去调用这两个实现类的call方法。
1-1:根据上面的说明写出代码
1-1-1: Phone
public interface Phone {
void call();
}
1-1-2:XiaoMiPhone
public class XiaoMiPhone implements Phone {
@Override
public void call() {
System.out.println("使用小米手机打电话!");
}
}
1-1-3:HuaWeiPhone
public class HuaWeiPhone implements Phone {
@Override
public void call() {
System.out.println("使用华为手机打电话");
}
}
1-1-4:测试 Main
public class Main {
public static void main(String[] args) {
XiaoMiPhone xm = new XiaoMiPhone();
HuaWeiPhone hw = new HuaWeiPhone();
xm.call();
hw.call();
}
}
1-2:对上面代码分析
- 我们主要目的是想得到一个对象,但是我们必须知道这个类的名字,如果还有参数的话。我们还要去写上它的参数。
- 类的创建越复杂,我们使用这种方式创建起来就越麻烦。
- 所以我们引入工厂模式,使用工厂来统一创建对象。
二、简单工厂模式(静态工厂模式)
1-1:基本介绍
简单工厂模式是属于创建型模式。定义了一个创建对象的类,由这个类来封装实例化对象的行为 (由这个类来代替我们去创建对象)
1-2:使用简单工厂模式解决上面的问题
1、我们创建一个简单工厂 SimpleFactory
public class SimpleFactory {
public static Phone getPhone(String type){
if ("小米".equals(type)){
return new XiaoMiPhone();
}else if ("华为".equals(type)){
return new HuaWeiPhone();
}else {
return null;
}
}
}
1、使用简单工厂创建对象并调用
public class Main {
public static void main(String[] args) {
SimpleFactory.getPhone("小米").call();
SimpleFactory.getPhone("华为").call();
}
}
1-3:总结分析
- 使用简单工厂创建对象,我们只要知道我们创建什么对象即可,不需要去关注创建的过程。
- 但是如果我们现在新增一个一加手机呢?
-
- 我们新建一个一加类,然后在简单工厂里面去新增一个 else if 即可。
-
- 但是我们写代码有一个原则,开闭原则:新增功能的时候,不能去修改之前的代码
三、工厂方法模式
3-1:基本介绍
定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类
3-2:使用工厂方法模式解决上面的问题
1、创建一个工厂接口 PhoneFactory
public interface PhoneFactory {
Phone getPhone();
}
2、创建小米工厂、华为工厂
public class XiaoMiFactory implements PhoneFactory {
@Override
public Phone getPhone() {
return new XiaoMiPhone();
}
}
public class HuaWeiFactory implements PhoneFactory {
@Override
public Phone getPhone() {
return new HuaWeiPhone();
}
}
3、测试
public class Main {
public static void main(String[] args) {
new XiaoMiFactory().getPhone().call();
new HuaWeiFactory().getPhone().call();
}
}
3-3:总结分析
- 如果我们新增一加手机,那么我们只需要新增一个 YiJiaFactory implements PhoneFactory 类即可。
- 使用工厂方法模式解决了新增的时候需要修改之前代码的问题。
- 虽然看起来好像更加复杂了,但是如果代码很多的时候。后续维护性才是最重要的。
四、抽象工厂模式
抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类
4-1、引入抽象工厂模式
上面我们两个厂商只有一个产品(手机),如果这个时候又多了一个比如耳机呢?
上面我们使用小米工厂(XiaoMiFactory )去实现手机工厂接口(PhoneFactory ),当然了Java是支持多实现的,我们可以再实现一个耳机工厂接口。
其实这个都不必解释了,肯定不合理的。如果1000个产品难道实现1000个嘛?
这个时候我们就要把这些抽象的工厂接口进行一个整合,把它放在一个产品接口里面去。再由我们的具体工厂比如小米工厂去实现它。
4-2、代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H7Dp8U10-1587481533633)(https://www.xdx97.com:8185/api/preview?url=uploads/ARTICLE/root/article/2020-04-21/xdx_gleR72bT8zGbRPjf.png)]
1、工厂接口
// 耳机工厂
public interface HeadSetFactory {
void hear();
}
// 手机工厂
public interface PhoneFactory {
void call();
}
// 产品接口
public interface ProductFactory {
HeadSetFactory getHeadSet();
PhoneFactory getPhone();
}
2、具体产品的实现 - 华为
// 华为耳机具体实现
public class HuaWeiHeadSet implements HeadSetFactory {
@Override
public void hear() {
System.out.println("使用华为耳机听歌");
}
}
// 华为手机具体实现
public class HuaWeiPhone implements PhoneFactory {
@Override
public void call() {
System.out.println("使用华为手机打电话");
}
}
// 华为工厂实现
public class HuaWeiFactory implements ProductFactory {
@Override
public HeadSetFactory getHeadSet() {
return new HuaWeiHeadSet();
}
@Override
public PhoneFactory getPhone() {
return new HuaWeiPhone();
}
}
3、具体产品实现 - 小米
// 小米耳机实现
public class XiaoMiHeadSet implements HeadSetFactory {
@Override
public void hear() {
System.out.println("使用小米耳机听歌!");
}
}
// 小米手机实现
public class XiaoMiPhone implements PhoneFactory {
@Override
public void call() {
System.out.println("使用小米手机打电话!");
}
}
// 小米工厂实现
public class XiaoMiFactory implements ProductFactory {
@Override
public HeadSetFactory getHeadSet() {
return new XiaoMiHeadSet();
}
@Override
public PhoneFactory getPhone() {
return new XiaoMiPhone();
}
}
4、测试,结果就不放出来了,代码很简单没有意外。
public class Main {
public static void main(String[] args) {
new XiaoMiFactory().getPhone().call();
new XiaoMiFactory().getHeadSet().hear();
new HuaWeiFactory().getPhone().call();
new HuaWeiFactory().getHeadSet().hear();
}
}
抽象工厂还是不太好理解的,多看几遍。然后跟着敲一下,总结一下。