工厂方法模式Factory Method Pattern-23种常用设计模式快速入门教程
1.工厂方法前言
在GOF出版的《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
2.工厂方法模式定义
工厂方法模式是一种创建型设计模式,它可以让我们通过定义工厂方法实现对象的创建,从而让我们可以灵活地控制对象的创建。
3.工厂方法模式优点
它可以让我们实现可扩展、可组合的对象创建,从而提高软件系统的拓展性和可维护性。
4.工厂方法模式缺点
它可能会导致系统变得非常复杂,增加系统的开发时间,导致系统性能的下降。
5.工厂方法模式示例代码
传统设计模式讲解时使用的示例代码,大都采用与读者日常生活接解的业务系统没有多大关联关系。以致大部分读者无法做到学以致用,学完就忘记。本文采用使用日常生活中随处可见的支付与优惠券业务来编写实现代码:
5.1 工厂方法模式(Factory Method)
- 一个抽象产品类,可以派生出多个具体产品类。每个具体工厂类只能创建一个具体产品类的实例。
- 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
- 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
//定义工厂方法模式抽象工厂类
public abstract class PaymentFactory {
public abstract Payment createPayment();
}
//定义工厂方法模式具体工厂类
public class CreditCardPaymentFactory extends PaymentFactory {
@Override
public Payment createPayment() {
return new CreditCardPayment();
}
}
//工厂方法模式客户端使用
public class Client {
public static void main(String[] args) {
PaymentFactory factory = new CreditCardPaymentFactory();
Payment payment = factory.createPayment();
payment.process();
}
}
5.2简单工厂模式(Simple Factory)
//工厂方法模式的抽象工厂类
public abstract class CouponFactory {
public abstract Coupon createCoupon(String couponType);
}
//工厂方法模式的具体工厂类
public class ConcreteFactory extends CouponFactory {
@Override
public Coupon createCoupon(String couponType) {
switch (couponType) {
case "discount":
return new DiscountCoupon();
case "cashback":
return new CashBackCoupon();
default:
return null;
}
}
}
//工厂方法模式的抽象产品类
public abstract class Coupon
{
public abstract void printCouponInfo();
}
//工厂方法模式的具体产品类
public class DiscountCoupon extends Coupon {
@Override public void printCouponInfo() {
System.out.println("This is a discount coupon!");
}
}
public class CashBackCoupon extends Coupon {
@Override public void printCouponInfo() { System.out.println("This is a cash back coupon!");
}
}
//工厂方法模式的客户端使用
public class Client {
public static void main(String[] args) {
CouponFactory couponFactory = new ConcreteFactory();
Coupon discountCoupon = couponFactory.createCoupon("discount");
discountCoupon.printCouponInfo();
Coupon cashbackCoupon = couponFactory.createCoupon("cashback");
cashbackCoupon.printCouponInfo();
}
}