封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的
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();
}
在Android中的应用
说个比较常见的需求吧,比如老板让你设计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();
}
其实我想过为什么非要通过工厂这一层呢?直接通过抽象类的实现类执行方法不行吗?后面我想了下,我的理解是工厂类可以统一管理,并且做一些统一操作,就跟实际的工厂可以统一管理机器生产产品一样。
如果有说的不对的地方可以一起讨论下。
网友评论