抽象工厂模式
1.定义:
抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
与工厂方法模式的区别
工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。
理解产品族和产品等级
产品族:一个品牌下面的所有产品;例如华为下面的手机,路由器,电脑 称为华为的产品族;
产品等级:多个品牌下面的同种产品;例如华为和小米下面的手 称为一个产品等级;
1.1代码实现
1.1.1创建产品接口
package abstractfactory;
//电视接口
public interface TV {
void create();
}
package abstractfactory;
//手机接口
public interface Phone {
void create();
}
1.1.2定义具体产品的实现类
package abstractfactory;
public class HuWeiTV implements TV {
@Override
public void create() {
System.out.println("创建华为电视");
}
}
package abstractfactory;
public class XiaoMiTV implements TV{
@Override
public void create() {
System.out.println("创建小米电视");
}
}
1.1.3 创建超级工厂的接口
package abstractfactory;
//超级工厂接口
public interface factory {
Phone createPhone();
TV creatTV();
}
1.1.4 创建产品族(华为,小米)对应工厂的实现类
package abstractfactory;
//华为工厂
public class HuaWeiFactory implements factory{
@Override
public HuaWeiPhone createPhone() {
System.out.println("华为工厂创建");
return new HuaWeiPhone();
}
@Override
public HuaWeiTV creatTV() {
System.out.println("华为工厂创建");
return new HuaWeiTV();
}
}
package abstractfactory;
//小米工厂创建
public class XiaoMiFactory implements factory{
@Override
public XioaMiPhone createPhone() {
System.out.println("小米工厂创建");
return new XiaoMiPhone();
}
@Override
public XiaoMiTV creatTV() {
System.out.println("小米工厂创建");
return new XiaoMiTV();
}
}
1.1.5 测试最终使用
package abstractfactory;
public class Test {
public static void main(String[] args) {
factory huaWeiFactory = new HuaWeiFactory();
huWeiTV.createPhone().create();
factory xiaoMiFactory = new XiaoMiFactory();
xiaoMiFactory.creatTV().create();
}
}
结果展示:
类图:
2.抽象工厂模式的优缺点
**优点:**一个产品族(小米,华为品牌)中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象(将一个系列的产品统一一起创建);
缺点:
产品族 扩展非常困难,要增加一个系列的某一产品,既要修改工厂抽象类里加代码,又修改具体的实现类里面加代码;
增加了系统的抽象性和理解难度;
注意事项
产品族难扩展,产品等级易扩展。
3.适用场景
一系列相关产品对象(属于同一产品族)一起创建时需要大量的重复代码;
提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现;
4.使用注意
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
小结:抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交。