抽象工厂概念
抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式的核心思想是将对象的创建与使用分离开来,从而实现系统的松耦合。在抽象工厂模式中,客户端不需要知道具体产品的类名,只需要知道产品的抽象类或接口即可。
抽象工厂模式包含以下角色:
-
抽象工厂:定义了一组创建产品的方法,每个方法对应一个具体的产品族。
-
具体工厂:实现抽象工厂接口,负责创建一组具体的产品。
-
抽象产品:定义了产品的公共接口。
-
具体产品:实现抽象产品接口,是具体工厂创建的产品。
抽象工厂模式的优点:
-
可以在不修改客户端代码的情况下,更换产品系列。
-
可以保证客户端使用的产品是同一系列的,避免了产品之间的不兼容问题。
-
可以将产品的创建与使用分离开来,从而实现系统的松耦合。
抽象工厂模式的缺点:
-
增加新的产品族比较困难,需要修改抽象工厂和所有的具体工厂。
-
增加新的产品等级结构比较困难,需要修改抽象工厂和所有的具体工厂。
抽象工厂模式的适用场景:
-
系统需要一组相关的产品,而这些产品之间存在一定的关联或依赖关系。
-
系统需要在不同的平台或不同的环境下使用不同的产品。
-
系统需要提供一个产品类库,而且这些产品的实现都必须相互兼容。
抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。抽象工厂模式是工厂方法模式的升级版,它不仅可以创建单个对象,还可以创建一系列相关的对象。
抽象工厂案例
下面我们来看一个使用抽象工厂模式的案例:
假设我们正在开发一个电子商务网站,需要实现一个购物车功能。购物车分为两类:普通购物车和VIP购物车。普通购物车中包含商品、数量和价格,VIP购物车中除了包含商品、数量和价格外,还包含积分和优惠券。
为了实现这个购物车功能,我们可以使用抽象工厂模式。首先,我们需要定义一个抽象工厂接口,用于创建购物车和购物车中的商品对象。代码如下:
// 抽象工厂接口
public interface CartFactory {
Cart createCart();
Product createProduct(String name, int price);
}
// 购物车接口
public interface Cart {
void addProduct(Product product, int quantity);
void removeProduct(Product product);
double getTotalPrice();
}
// 商品接口
public interface Product {
String getName();
int getPrice();
}
然后,我们需要实现具体的工厂类来创建普通购物车和VIP购物车以及对应的商品对象。代码如下:
// 普通购物车工厂
public class NormalCartFactory implements CartFactory {
@Override
public Cart createCart() {
return new NormalCart();
}
@Override
public Product createProduct(String name, int price) {
return new NormalProduct(name, price);
}
}
// VIP购物车工厂
public class VipCartFactory implements CartFactory {
@Override
public Cart createCart() {
return new VipCart();
}
@Override
public Product createProduct(String name, int price) {
return new VipProduct(name, price);
}
}
// 普通购物车
public class NormalCart implements Cart {
private Map<Product, Integer> products = new HashMap<>();
@Override
public void addProduct(Product product, int quantity) {
products.put(product, quantity);
}
@Override
public void removeProduct(Product product) {
products.remove(product);
}
@Override
public double getTotalPrice() {
double totalPrice = 0;
for (Map.Entry<Product, Integer> entry : products.entrySet()) {
Product product = entry.getKey();
int quantity = entry.getValue();
totalPrice += product.getPrice() * quantity;
}
return totalPrice;
}
}
// VIP购物车
public class VipCart implements Cart {
private Map<Product, Integer> products = new HashMap<>();
private int points;
private String coupon;
@Override
public void addProduct(Product product, int quantity) {
products.put(product, quantity);
}
@Override
public void removeProduct(Product product) {
products.remove(product);
}
@Override
public double getTotalPrice() {
double totalPrice = 0;
for (Map.Entry<Product, Integer> entry : products.entrySet()) {
Product product = entry.getKey();
int quantity = entry.getValue();
totalPrice += product.getPrice() * quantity;
}
return totalPrice;
}
public void addPoints(int points) {
this.points += points;
}
public void useCoupon(String coupon) {
this.coupon = coupon;
}
}
// 普通商品
public class NormalProduct implements Product {
private String name;
private int price;
public NormalProduct(String name, int price) {
this.name = name;
this.price = price;
}
@Override
public String getName() {
return name;
}
@Override
public int getPrice() {
return price;
}
}
// VIP商品
public class VipProduct implements Product {
private String name;
private int price;
public VipProduct(String name, int price) {
this.name = name;
this.price = price;
}
@Override
public String getName() {
return name;
}
@Override
public int getPrice() {
return price;
}
}
最后,我们可以使用这些类来创建购物车和商品对象。代码如下:
public class Client {
public static void main(String[] args) {
CartFactory normalCartFactory = new NormalCartFactory();
Cart normalCart = normalCartFactory.createCart();
Product normalProduct = normalCartFactory.createProduct("普通商品", 100);
normalCart.addProduct(normalProduct, 1);
System.out.println("普通购物车总价:" + normalCart.getTotalPrice());
CartFactory vipCartFactory = new VipCartFactory();
Cart vipCart = vipCartFactory.createCart();
Product vipProduct = vipCartFactory.createProduct("VIP商品", 200);
vipCart.addProduct(vipProduct, 1);
vipCart.addPoints(100);
vipCart.useCoupon("VIP优惠券");
System.out.println("VIP购物车总价:" + vipCart.getTotalPrice());
}
}
运行结果如下:
普通购物车总价:100.0
VIP购物车总价:200.0
通过抽象工厂模式,我们可以轻松地创建不同类型的购物车和商品对象,而无需关注它们的具体实现,从而提高了代码的灵活性和可维护性。