设计模式之工厂模式

简介

  • 工厂模式介绍

    • 它提供了一种创建对象的最佳方式,我们在创建对象的时候不会对客户端暴露创建逻辑,通过使用一个公共的接口来指向新创建的对象
  • 3种实现方式

    • 简单工厂:通过传入相关的类型来返回相应的类
    • 工厂方法:通过实现类实现相应的方法来决定相应的返回结果
    • 抽象工厂:基于上述两种模式的扩展
  • 应用场景

    • 解耦
    • 复用代码,降低维护成本

实践

简单工厂模式

  • 也称为静态工厂模式,根据传参的不同返回不同类的实例
  • 核心组成
    • Factory:工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑
    • xxInteface:抽象父类,简单工厂模式所创建的所有对象的父类,,描述所有实例所共用的公共接口
    • xxx.class:具体类,是简单工厂模式的创建目标
  • 实现步骤:
    • 创建公共接口类,定义公共的抽象方法,由具体的实现类去实现
public interface Pay{
//统一的下单接口
	void unifiedorder(); 
}
  • 创建具体的实现类,实现各自的方法
public class WechatPay implements Pay{
	@Override
	public void unifidorder(){
		System.out.println("微信支付");
	}
}
public class AliPay implements Pay{
	@Override
	public void unifidorder(){
		System.out.println("阿里支付");
	}
}
  • 创建工厂类,提供静态方法
public calss SimplePayFactory{
	public static Pay createPay(String payType){
		if(payType != null){
			if("wechat".equalIgnoreCase(payType))			{
			return new WechatPay();
		}else if("alipay".equalIgnoeCase(payType)){
			return new AliPay();
		}

		}
	}

}
  • 使用

public class test{
	public static void main(String[] args){
		Pay wechat = SimplePayFactory.createPay("wechat");
		wechat.unifidorder();

		Pay ali = SimplePayFactory.createPay("aliPay");
		ali.unifidorder();

	}
}
  • 优点:降低系统的耦合度
  • 缺点:工厂类违背了开闭原则,增加一个类型就得修改代码

工厂方法模式:

  • 对简单工厂模式的进一步抽象化,在静态工厂模式的情景下,代码无法满足开闭原则,而工厂方法模式满足

image.png

  • 核心组成
    • 创建公共接口类,定义公共的抽象方法,由具体的实现类去实现
public interface Pay{
//统一的下单接口
	void unifiedorder(); 
}
  • 具体类,是简单工厂模式的创建目标
public class WechatPay implements Pay{
	@Override
	public void unifidorder(){
		System.out.println("微信支付");
	}
}
public class AliPay implements Pay{
	@Override
	public void unifidorder(){
		System.out.println("阿里支付");
	}
}
  • 抽象工厂类
public interface MethodFactory(){
	Pay getPay();
}
  • 具体工厂类
public class AliPayFactory() implements MethodFactory{
	@Override
	Pay getPay(){
		return new AliPay();
	}
}
public interface MethodFactory() implements MethodFactory{
	@Override
	Pay getPay(){
		return new WetchatPay();
	}
}
  • 使用
public class test{
	public static void main(String[] args){
		PayFactory aliFactory = new AliPayFactory();
        	aliFactory.getPay().unifiedorder();
	}
}
  • 优缺点
    • 优点:符合开闭原则,单一原则,每个工厂只生产对应的支付方式
    • 缺点:每增加一个产品,就需要增加一个具体工厂类和具体的产品类

抽象工厂模式

  • 基于上面两种模式的扩展,是方法模式的升级版本,当需要创建多个产品线的时候使用抽象工厂模式更好,比如说,不止只有unifidorder方法,还有支付,退款等方法。抽象工厂模式是spring种应用最为广泛的
    image.png
    image.png
  • 实现步骤
    • 定义 支付pay,退款refund接口
public interface Pay{
	void unifiedorder();
}
public interface Refund{
	void refund();
}
  • 根据不同产品族实现pay和refund的接口
public class AliPay implements Pay{
	@Override
	void unifiedorder(){
		System.out.println("阿里支付");
	}
}
public class WechtPay implements Pay{
	@Override
	void unifiedorder(){
		System.out.println("微信支付");
	}
}
public class AliRefund implements Refund{
	@Override
	void refund(){
		System.out.println("阿里退款");
	}
}
public class WechatRefund implements Refund{
	@Override
	void refund(){
		System.out.println("微信退款");
	}
}
  • 创建抽象工厂,里面分别生产 Pay跟Refund接口

public interface OrderFactory{
	Pay getPay();
	Refund getRefund();
}
  • 创建支付宝产品族,实现OrederFactory

public class AliOrederFactory implements OrderFactory{
	@Override
	Pay getPay(){
		return new AliPay();
	}
	@Override
	Refund getRefund(){
		return new AliRefund();
	}
}
  • 创建微信产品族,实现OrederFactory

public class WechatOrederFactory implements OrderFactory{
	@Override
	Pay getPay(){
		return new WechatPay();
	}
	@Override
	Refund getRefund(){
		return new WecahtRefund();
	}
}
  • 定义一个超级工厂,通过传递参数获取对应的工厂
public class Producer{
	public static OrderFactory getFactory(String payType ){
	if(payType != null){
		if("wechat".euqalsIgnoreCase(payType)){
			return new WechatOrederFactory
		}else if("ali".euqalsIgnoreCase(payType)){
			return new WechatOrederFactory
		}
	}
	
}
  • 测试
public class test(){

	public static void main(String[] args){
		OrderFactory ali = Producer.getFactory("ali");
        ali.getPay().unifiedorder();
        ali.gertRefund().refund();
	}
}

评论

渣男 : 456
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×