工厂模式

工厂模式

代码编写出来是为了给别人 (client) 调用的:ide

  • 调用者 (client) 跟代码编写者 (provider),多是同一我的,也多是不一样的人
  • 提供给调用者的代码,有多是源码可见的,也多是源码不可见、不可修改的(好比 jar 包)

因此,为了简化代码的协做使用及管理维护,必须想尽办法简化代码逻辑,实现必要的分离spa

1 最原始的方式

好比说,有一系列的代码,是用来建立不一样品牌的手机。代码是这样的:3d

public class Iphone {
    public void mypg () {}
}
public class Huawei {
    public void myhwi () {}
}
public class Lennovo {}
public class Xiaomi {}
public class Vivo {}

若是这样的代码提供给客户端调用,那么提供者必需要将全部类的名称以及对应的方法暴露给客户端。code

客户端的调用示例以下:blog

Iphone pg = new Iphone();
phone1.mypg();

Huawei hw = new Huawei();
phone2.myhw();

这样的方式很是原始,也很简单,可是代码的逻辑不清晰,暴露的内容过多。接口

解决的方案:开发

  • 抽象逻辑,提供接口

2 有了接口以后

为了减小方法调用的复杂度,也为了便于抽象跟代码管理,我们额外提供一个接口:源码

public interface Phone {
    void play();
}

而后,将全部手机类都实现 Phone 接口,将暴露给客户端调用的逻辑都封装在 play 方法里。产品

那么,客户端须要知道的调用 API 就减小到了两种:it

  1. Phone 接口的信息
  2. Phone 接口有哪些实现类

调用的逻辑就变简单了:

Phone phone1 = new Iphone();
phone1.play();

Phone phone2 = new Lianxiang();
phone2.play();

Phone phone3 = new Xiaomii();
phone3.play();

这种方式有缺点:

  1. 客户端,必需要知道手机类的具体名字
  2. 客户端的调用,跟提供的代码是耦合的

因此,天然产生了简单工厂的这种策略

3 简单工厂

在中间加一层:

public class PhoneFactory {
    public Phone createPhone(String tag) {
        if (tag.equals("lx")) {
            return new Lenovo();
        } else if (tag.equals("pg")) {
            return new Iphone();
        } else if (tag.equals("hw")) {
            return new Huawei();
        }
    }
}

客户端的调用:

PhoneFactory pf = new PhoneFactory();

pf.createPhone("hw").play();
pf.createPhone("pg").play();
pf.createPhone("xm").play();

简单工厂模式,自己已经为解耦合作出了很好的方案。可是它有缺点:

  • PhoneFactory 代码跟 Phone 代码紧耦合
  • 每次要添加/删除/修改某一个 Phone,须要修改 PhoneFactory 这个类

解决方案就是工厂方法模式

4 工厂方法模式

为 Phone 工厂,建立一个接口:

public interface GCIphoneFactory {
Phone createPhone();
}

若是增长了一款产品,好比是 iPhone,那么,只须要为 iPhone 建立一个工厂类就能够了:

 

public class IphoneFactory implements GCIphoneFactory {
    @Override
    public Phone createPhone() {
        return new IPhone();
    }
}

若是再增长另一款产品,好比 Huawei,那么只须要另一个工厂就能够了:

 

public class HuaweiFactory implements GCIphoneFactory {
    @Override
    public Phone createPhone() {
        return new Huawei();
    }
}

客户端的调用:

GCIphoneFactory gc = new HuaweiFactory();
gc.createPhone().play();
        
GCIphoneFactory pg = new IphoneFactory();
pg.createPhone().play();

工厂方法模式,是最标准的一种工厂模式,也是应用普遍的一种模式

可是工厂方法模式,有一个很大的缺点:

   每增长一个产品,相应的也要增长一个子工厂,加大了额外的开发量。
相关文章
相关标签/搜索