设计模式 - 简单工厂模式

综述 Overall

简单来说,简单工厂模式是由一个工厂类来创建其他类的实例。根据传入工厂类参数的不同,工厂类可以生成不同类的对象(通常这些类都继承自同样的父类)。

值得注意的是,简单工厂模式并不是一个成熟且规范的设计模式,因为他违背了软件设计的开闭原则(即每次增加新的产品都需要修改工厂类的逻辑判断)。

实例 Example

用户去超市购物,可以选择多种支付方式,包括现金、信用卡、微信、支付宝。请按照简单工厂模式的思想设计一个程序,让超市收银方类(Client)知道用户是使用的什么支付方式,支付了多少钱。

请画出对应的类图,并编写代码。

类图 Class Diagram

image-20210329134055418

具体代码 Code

  • 工厂类

    public class PaymentFactory {
        public static Payment selectPayment(String paymentType) throws Exception {
            if(paymentType.equalsIgnoreCase("wechat")){
                return new WechatPayment();
            }
            else if (paymentType.equalsIgnoreCase("alipay")){
                return new AlipayPayment();
            }
            else if (paymentType.equalsIgnoreCase("cash")){
                return new CashPayment();
            }
            else if (paymentType.equalsIgnoreCase("creditcard")){
                return new CreditCardPayment();
            }
            else{
                throw new Exception("暂不支持该支付方式");
            }
        }
    }
    
  • 抽象支付类

    public interface Payment {
        public void pay(int amount);
    }
    
  • 微信支付类

    public class WechatPayment implements Payment {
        public void pay(int amount) {
            System.out.println("微信收款" + amount + "元");
        }
    }
    
  • 支付宝支付类

    public class AlipayPayment implements Payment {
        public void pay(int amount) {
            System.out.println("支付宝收款" + amount + "元");
        }
    }
    
  • 现金支付类

    public class CashPayment implements Payment{
        public void pay(int amount) {
            System.out.println("现金收款" + amount + "元");
        }
    }
    
  • 信用卡支付类

    public class CreditCardPayment implements Payment {
        public void pay(int amount) {
            System.out.println("信用卡收款" + amount + "元");
        }
    }
    
  • 用户 Client

    public class Client {
        public static void main(String[] args) {
            try{
                Payment payment;
                payment = PaymentFactory.selectPayment("wechat");
                payment.pay(100);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
执行结果

image-20210329141137556