设计模式 - 简单工厂模式
综述 Overall
简单来说,简单工厂模式是由一个工厂类来创建其他类的实例。根据传入工厂类参数的不同,工厂类可以生成不同类的对象(通常这些类都继承自同样的父类)。
值得注意的是,简单工厂模式并不是一个成熟且规范的设计模式,因为他违背了软件设计的开闭原则(即每次增加新的产品都需要修改工厂类的逻辑判断)。
实例 Example
用户去超市购物,可以选择多种支付方式,包括现金、信用卡、微信、支付宝。请按照简单工厂模式的思想设计一个程序,让超市收银方类(Client)知道用户是使用的什么支付方式,支付了多少钱。
请画出对应的类图,并编写代码。
类图 Class Diagram
具体代码 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(); } } }