抽象工厂模式
基础概念
抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。(用来生产不同产品族的全部产品。)
自己的理解
- 抽象工厂模式我觉得就是对工厂方法模式的继续抽象,举个例子:现在有大众、奥迪两个品牌,然后每种品牌还有单车、汽车不同类型,之前工厂方法是设计一个工厂接口,然后分别实现大众汽车单车、奥迪汽车单车的实现类分别创建4个不同工厂。在抽象工厂模式中,继续抽象,他是设计一个工厂接口,然后分别实现两个工厂,并在每个工厂中分别实现两个方法,分别创建单车、汽车。
- 就是如果每个品牌的产品族非常重合,就比较适合抽象工厂模式。比如小米、华为,有手机,耳机等等。反之就是工厂方法模式。比如小米和美的,这两种就很不重合。
代码实现(以汽车为例)
首先创建汽车的接口,以及实现类
package 抽象工厂;
public interface car {
void getName();
void run();
}
class aodiCar implements car{
@Override
public void getName() {
System.out.println("这是一脸奥迪汽车");
}
@Override
public void run() {
System.out.println("奥迪汽车可以跑");
}
}
class dazhongCar implements car{
@Override
public void getName() {
System.out.println("这是一辆大众汽车");
}
@Override
public void run() {
System.out.println("大众汽车可以跑");
}
}
接着创建单车的接口及其实现类
package 抽象工厂;
public interface bike {
void getName();
void take();
}
class aodiBike implements bike{
@Override
public void getName() {
System.out.println("这是一俩奥迪单车");
}
@Override
public void take() {
System.out.println("奥迪单车可以骑");
}
}
class dazhongBike implements bike {
@Override
public void getName() {
System.out.println("这是一辆大众单车");
}
@Override
public void take() {
System.out.println("大众单车可以骑");
}
}
接着创建工厂类
package 抽象工厂;
public interface factory {
car getCar();
bike getBike();
}
class aodiFactory implements factory{
@Override
public car getCar() {
return new aodiCar();
}
@Override
public bike getBike() {
return new aodiBike();
}
}
class dazhongFactory implements factory {
@Override
public car getCar() {
return new dazhongCar();
}
@Override
public bike getBike() {
return new dazhongBike();
}
}
最后进行测试
package 抽象工厂;
public class test {
public static void main(String[] args) {
factory dazhong = new dazhongFactory();
factory aodi = new aodiFactory();
bike dazhongbike = dazhong.getBike();
dazhongbike.getName();
dazhongbike.take();
car dazhongcar = dazhong.getCar();
dazhongcar.getName();
dazhongcar.run();
System.out.println("=================================");
car aodicar = aodi.getCar();
aodicar.getName();
aodicar.run();
bike aodibike = aodi.getBike();
aodibike.getName();
aodibike.take();
}
}