1.为阅读体验,本站无任何广告,也无任何盈利方法,站长一直在用爱发电,现濒临倒闭,希望有能力的同学能帮忙分担服务器成本
2.捐助10元及以上同学,可添加站长微信lurenzhang888,备注捐助,网站倒闭后可联系站长领取本站pdf内容
3.若网站能存活下来,后续将会持续更新内容
工厂模式相比于上次介绍的代理模式,实现起来会简单一些。
工厂模式是使用频率比较高的设计模式,例如在Spring框架就应用了工厂模式,可以看到不少Factory
工厂模式可以分为简单工厂模式、工厂模式、抽象工厂模式三种,实现的复杂程度是递增的,但不是越复杂就越好,应该在不同的场景使用适合该场景的工厂模式
简单工厂模式
简单工厂模式不属于23种设计模式,其实现起来也是非常简单,简单来说就是定义一个工厂类,根据传入的不同参数返回不同的实例。说起来比较抽象,看下代码就理解了,先看UML类图,主要可以分为三部分,工厂类、抽象接口、具体产品,以生产手机为例,可以生产华为和小米两种手机
代码如下
抽象接口(AbstractProduct),抽象接口的作用是定义一些产品公用的方法,比如拍照等,会在具体产品中有不同的实现
public interface Phone {
void myPhone(); //随便定义一个方法
}
具体产品(XiaoMi)
public class XiaoMI implements Phone {
public XiaoMI() {
this.myPhone();
}
@Override
public void myPhone() {
System.out.println(" XiaoMi Phone");
}
}
具体产品(HUAWEI)
public class HUAWEI implements Phone {
public HUAWEI() {
this.myPhone();
}
@Override
public void myPhone() {
System.out.println(" HUAWEI Phone");
}
}
工厂类(PhoneFactory)
public class PhoneFactory {
public Phone productPhone(String phoneType) {
if(phoneType.equalsIgnoreCase("XiaoMi")){
return new XiaoMi();
}
else if(phoneType.equalsIgnoreCase("HUAWEI")) {
return new HUAWEI();
}
return null;
}
}
测试一下(client)
public class client {
public static void main(String[] arg) {
PhoneFactory factory = new PhoneFactory();
Phone XiaoMi = factory.productPhone("XiaoMI");
Phone HUAWEI = factory.productPhone("HUAWEI");
}
}
这就是简单工厂模式,很简单,就是通过传入不同的参数创建不同的实例
工厂模式
工厂模式相比简单工厂模式复杂了一点,将工厂类进行了细分,并且定义了一个抽象工厂类,还是用上面的例子就是,工厂类变成了抽象工厂类,并且多了生产华为手机的工厂类和生产小米手机的工厂类,如下图
和简单工厂相比就是将工厂类进行了拆分,并且抽象出一个抽象工厂,代码如下
具体产品类和抽象接口类没有变化,和简单工厂中的一样,
抽象工厂类(AbstractFactory)
public interface AbstractFactory {
Phone productPhone();
}
XiaoMiFactory
public class XiaoMiFactory implements AbstractFactory{
@Override
public Phone productPhone() {
return new XiaoMi();
}
}
HUAWEIFactory
public class HUAWEIFactory implements AbstractFactory{
@Override
public Phone productPhone() {
return new HUAWEI();
}
}
测试一下,
class client {
public static void main(String[] arg) {
AbstractFactory XiaoMiFactory = new XiaoMiFactory();
AbstractFactory HUAWEIFactory = new HUAWEIFactory();
XiaoMiFactory.productPhone();
HUAWEIFactory.productPhone();
}
}
看到这里,可能很多人没有看到工厂模式的优势在哪,反倒是一眼就看到了劣势,明显代码更加复杂了,要是再有其他手机那不是还得再加不少工厂类。
其实工厂模式这种做法是对代码的一种解耦,会使得代码更加方便扩展,用设计模式的话说就是遵循了开放封闭原则(设计模式六大原则之一),开闭原则是指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。用人话讲就是,代码尽可能通过扩展来实现新的需求或变化,而不是通过修改已有的代码。
比如再加一个OPPO手机,只需要增加OPPOFactory和OPPO具体的实现类,不需要改动原有代码
这就是工厂模式相比于简单工厂模式的优势和劣势,下面在看更加复杂的抽象工厂模式
抽象工厂模式
抽象工厂在思想上和工厂模式非常相似,只是对工厂模式进行了扩展,简单工厂模式和工厂模式都是只针对手机这种单一商品,现在华为和小米的工厂也要开始生产电脑了,只需要在工厂模式中扩展一下就可以了,增加一个PC接口,及具体实现类即可,这就是抽象工厂模式,如下图
为了加以区分,将之前的手机相关的名称后加了Phone,并且抽象工厂接口及工厂方法接口增加生产电脑的相应方法,代码如下
AbstractProductPC
public interface PC {
void myPC();
}
XiaoMiPC
public class XiaoMiPC implements PC {
public XiaoMiPC() {
this.myPC();
}
@Override
public void myPC() {
System.out.println("XiaoMi PC");
}
}
HUAWEIPC
public class HUAWEIPC implements PC {
public HUAWEIPC() {
this.myPC();
}
@Override
public void myPC() {
System.out.println("HUAWEI PC");
}
}
AbstrctFactory
public interface AbstractFactory {
Phone productPhone();
PC productPC();
}
XiaoMiFactory
public class XiaoMiFactory implements AbstractFactory{
@Override
public Phone productPhone() {
return new XiaoMi();
}
@Override
public PC productPC() {
return new XiaoMiPC();
}
}
HUAWEIFactory
public class HUAWEIFactory implements AbstractFactory{
@Override
public Phone productPhone() {
return new HUAWEI();
}
@Override
public PC productPC() {
return new HUAWEIPC();
}
}
测试一下(client)
class client {
public static void main(String[] arg) {
AbstractFactory XiaoMiFactory = new XiaoMiFactory();
AbstractFactory HUAWEIFactory = new HUAWEIFactory();
XiaoMiFactory.productPhone();
XiaoMiFactory.productPC();
HUAWEIFactory.productPhone();
HUAWEIFactory.productPC();
}
}
输出输出
XiaoMi Phone
XiaoMi PC
HUAWEI Phone
HUAWEI PC
这就是抽象工厂模式,三种工厂模式没有好坏之分,只有适合与不适合,应针对不同的场景,选择合适的工厂模式
本站链接:https://www.mianshi.online,如需勘误或投稿,请联系微信:lurenzhang888
点击面试手册,获取本站面试手册PDF完整版