封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的
ok,还是举个🌰, 既然是工厂模式,就打比方有一个工厂生产产品,首先要一个抽象产品类,描述产品的公共方法,以及两个具体的产品(手机产品和电视产品):
/** * 抽象产品类,所有产品的抽象父类,描述公共的方法部分 */ public abstract class Product { public abstract void dosomething(); } /** * 具体产品类,所有产品的抽象父类,描述公共的方法部分 * 这里比如想生产 手机产品,电视产品 */ public class PhoneProduct extends Product { @Override public void dosomething() { //具体事情实现,比如这里生产cpu,屏幕,摄像头等制作手机 } } public class TvProduct extends Product { @Override public void dosomething() { //具体事情实现,比如这里生产电视屏幕,遥控器等 } } 复制代码
再把工厂的制造产品方法抽象出来,实现具体工厂类
/** * 抽象工厂类,生产一个泛型的产品对象 */ public abstract class Factory { public abstract Product createProduct(Class<? extends Product> c); } /** * 具体工厂类,所有产品从这里生产,可以返回具体的产品对象 */ public class RealFactory extends Factory { public Product createProduct(Class<? extends Product> c) { Product product = null; try { product = (Product) Class.forName(c.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return product; } } 复制代码
ok,所有工作就绪,一套工厂系统完成,接下来就可以让工厂建造出不同的产品,而且需要新产品只需要实现Product接口即可,实现解耦
public void main() { Factory factory = new RealFactory(); Product product=factory.createProduct(PhoneProduct.class); product.dosomething(); } 复制代码
说个比较常见的需求吧,比如老板让你设计app中的支付功能,支付方式有很多,以后也有可能添加支付方式。 这时候就可以把支付方式抽象出来,用一个工厂类统一管理,用于返回具体的支付方式类。这样支付的时候,调用工厂类的方法,把具体支付方式传给工厂就可以了。
简单写下代码:
public abstract class PayChannel { public abstract void doInit(); public abstract void doPay(); } public abstract class PayFactory { public abstract Product createProduct(Class<? extends PayChannel> c); } public class PayFactory extends PayFactory { public PayChannel createProduct(Class<? extends PayChannel> c) { //这里可以做一些统一的操作,比如记录数据等 PayChannel payChannel = null; try { payChannel = (PayChannel) Class.forName(c.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return payChannel; } } public void main() { PayFactory payFactory = new PayFactory(); PayChannel channel = payFactory.createProduct(WeixinPay.class); channel.doInit(); channel.doPay(); } 复制代码
其实我想过为什么非要通过工厂这一层呢?直接通过抽象类的实现类执行方法不行吗?后面我想了下,我的理解是工厂类可以统一管理,并且做一些统一操作,就跟实际的工厂可以统一管理机器生产产品一样。
如果有说的不对的地方可以一起讨论下。