工厂模式是用工厂方法代替new操作的一种模式。
大致分为三种:
1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
2.多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递类型出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
3.静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
下面一个一个举例子:
模拟一个付款事件,通过支付宝或者微信付款!
先定义一个支付接口
Pay.java
public interface Pay {
public void pay();
}
阿里支付宝支付
AliPay.java
public class AliPay implements Pay {
@Override
public void pay() {
System.out.println("pay by alipay");
}
}
微信支付
WechartPay.java
public class WechartPay implements Pay {
@Override
public void pay() {
System.out.println("pay by WechartPay");
}
}
下面是第一种情况:普通工厂模式的支付工厂
public class PayNormalFactory {
public Pay gotoPay(int type){
if(type == 1){
return new AliPay();
}else if(type == 2){
return new WechartPay();
}else{
System.out.println("请输入正确的类型!");
return null;
}
}
}
但是这种模式,如果传递的类型不是1或者2,就不能创造出正确的对象
那就需要多个工厂方法模式,所谓多个工厂方法就是将简单工厂模式的
public Pay gotoPay(int type){}
拆分成多个函数
public class PayMoreFactory {
public Pay gotoAliPay(){
return new AliPay();
}
public Pay gotoWeChartPay(){
return new WechartPay();
}
}
如果将上面的每个方法封装成静态方法,将不用创建 PayMoreFactory 的实例了!
这就成了静态工厂模式了:
public class PayStaticFactory {
public static Pay gotoAliPay(){
return new AliPay();
}
public static Pay gotoWeChartPay(){
return new WechartPay();
}
}
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。
在以上的三种模式中,第一种如果传入的int type有误的话,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
上面是工厂模式,那什么是抽象工厂模式呢?
说白了就是把工厂类搞成抽象的,每种付款方法增加一个工厂类!
这样的好处就是增加付款方法的时候不用去修改工厂类,只用增加一个新的工厂类就行了!
首先要定义一个工厂接口
PayFactory.java
public interface PayFactory {
public Pay gotoPay();
}
然后定义两个工厂类,分别生产 AliPay 和WeCahrtPay
public class AliPayFactory implements Factory {
@Override
public Pay gotoPay() {
return new AliPay();
}
}
public class WeChatPayFactory implements PayFactory {
@Override
public Pay gotoPay() {
return new WechartPay();
}
}
实这个模式的好处就是,如果你现在想增加一个新的付款模式,。比如百度付款
要先实现一个BaiduPay
public class BaiduPay implements Pay {
@Override
public void pay() {
System.out.println("pay by BaiduPay");
}
}
再实现一个 BaiduPay的工厂BaiduPayFactory
public class BaiduPayFactory implements PayFactory {
@Override
public Pay gotoPay() {
return new BaiduPay();
}
}
这样就行了,不用去修改以前写好的代码!
这样做,拓展性最好!
Activity作为“工厂方法”,具体View中显示什么由默认设置或者由子类来实现;ListActivity作为具体实现,它决定在View中显示的是ListView;这里的View是Activity中的默认显示,即为“Product”,而ListView是“ConcreteProduct”,由ListActivity来决定显示。