23天设计模式之抽象工厂模式
23天设计模式之抽象工厂模式
文章简介
《23天设计模式之抽象工厂模式》这是跟工厂模式相关的一篇文章,但是抽象工厂又是不同于工厂模式的,抽象工厂是围绕一个超级工厂去创建其它工厂,下面就一起来看看吧!
抽象工厂模式
定义
-
属于创建型模式,用于产品族的构建。产品族指的是某个品牌下的不同系类产品,如华为下的手机、电视、电脑等系列合起来就是华为的产品族。
-
抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
-
区别:工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。
通俗理解就是:
工厂方法模式中,有一个华为手机工厂类,这个工厂只能提供华为手机这一种产品,也就是只能提供华为手机,不能提供华为TV。
而抽象工厂中,有一个华为工厂类,这个工厂既能提供华为手机,也能提供华为TV,也就是华为系列的所有产品都能提供。
上文所指的产品系列指的是,华为手机是一个产品系列,华为TV是另一个产品系列。
-
增加新产品必须修改原有代码,不符合开闭原则,增加新产品族不用修改原有代码。
角色
- 抽象产品角色:描述产品有什么功能,一般用接口或抽象类表示。如 手机接口
- 具体产品角色:实现抽象产品角色的类,是真实的产品。如 华为手机
- 抽象工厂角色:描述产品族,表示具体工厂可以生产的所有产品。
- 具体工厂角色:实现抽象工厂角色的类,用于客户端调用创建产品实例。
代码实现
- 抽象产品角色
public interface Phone {
void call();
void send(String msg);
}
public interface TV {
// 播放
void play();
// 选择频道
void choose(int channel);
}
- 具体产品角色
public class HuaweiPhone implements Phone{
@Override
public void call() {
System.out.println("HuaweiPhone call...");
}
@Override
public void send(String msg) {
System.out.println("HuaweiPhone send... " + msg);
}
}
public class HuaweiTV implements TV{
@Override
public void play() {
System.out.println("HuaweiTV play...");
}
@Override
public void choose(int channel) {
System.out.println("HuaweiTV choose... " + channel);
}
}
public class XiaomiPhone implements Phone{
@Override
public void call() {
System.out.println("XiaomiPhone call...");
}
@Override
public void send(String msg) {
System.out.println("XiaomiPhone send... " + msg);
}
}
public class XiaomiTV implements TV{
@Override
public void play() {
System.out.println("XiaomiTV play...");
}
@Override
public void choose(int channel) {
System.out.println("XiaomiTV choose... " + channel);
}
}
- 抽象工厂角色
public interface AbstractFactory {
Phone getPhone();
TV getTV();
}
- 具体工厂角色
public class HuaweiFactory implements AbstractFactory{
@Override
public Phone getPhone() {
return new HuaweiPhone();
}
@Override
public TV getTV() {
return new HuaweiTV();
}
}
public class XiaomiFactory implements AbstractFactory{
@Override
public Phone getPhone() {
return new XiaomiPhone();
}
@Override
public TV getTV() {
return new XiaomiTV();
}
}
- 客户端测试
public class Client {
public static void main(String[] args) {
// 获得每个品牌的工厂
HuaweiFactory huaweiFactory = new HuaweiFactory();
XiaomiFactory xiaomiFactory = new XiaomiFactory();
// 获取不同品牌的产品,可以发现,这里获取到的产品都使用了向上转型,客户可以通过抽象接口操纵实例
Phone huaweiPhone = huaweiFactory.getPhone();
Phone xiaomiPhone = xiaomiFactory.getPhone();
TV huaweiTV = huaweiFactory.getTV();
TV xiaomiTV = xiaomiFactory.getTV();
huaweiPhone.call();
huaweiPhone.send("Huawei 你好");
xiaomiPhone.call();
xiaomiPhone.send("Xiaomi 你好");
huaweiTV.choose(1);
huaweiTV.play();
xiaomiTV.choose(2);
xiaomiTV.play();
}
}
HuaweiPhone call...
HuaweiPhone send... Huawei 你好
XiaomiPhone call...
XiaomiPhone send... Xiaomi 你好
HuaweiTV choose... 1
HuaweiTV play...
XiaomiTV choose... 2
XiaomiTV play...
Process finished with exit code 0
优缺点分析
-
优点:
- 分离了具体的类。客户通过抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。
- 易于交换产品系列。一个具体工厂类只在初始化时出现一次,这使得改变一个应用的具体工厂变得很容易,只需改变具体的工厂即可使用不同的产品配置。
- 有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
-
缺点:
- 难以支持新种类的产品。因为抽象工厂接口确定了可以被创建的产品集合,所以难以扩展抽象工厂以生产新种类的产品。
以上
感谢您花时间阅读我的博客,以上就是我对抽象工厂模式的一些理解,若有不对之处,还望指正,期待与您交流。
本篇博文系原创,仅用于个人学习,转载请注明出处。