工厂模式
1、简单工厂模式
分类:普通简单工厂、多方法简单工厂、静态方法简单工厂
1.1普通工厂模式
就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:
代码如下(举一个支付宝微信支付的例子):
首先创建支付宝微信共同实现的接口:
public interface Payment {
public void pay();
}
接着实现类:
public class Weixin implements Payment{
@Override
public void pay() {
System.out.println("使用微信支付");
}
}
public class Zhifubao implements Payment{
@Override
public void pay() {
System.out.println("使用支付宝支付");
}
}
接着工厂类:
public class PayFactory {
public Payment getPay(String type) {
if(type.equals("weixin"))
return new Weixin();
else if(type.equals("zhifubao"))
return new Zhifubao();
else
System.out.println("请输入正确的类型");
return null;
}
}
最后,我们测试下:
public class Test {
public static void main(String[] args) {
PayFactory payFactory = new PayFactory();
payFactory.getPay("weixin").pay();
}
}
输出:使用微信支付
1.2、多工厂方法模式
简单工厂模式若传入的字符串出错则不能正确创建出对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象,类图如下:
将简单工厂的工厂类修改:
public class PayFactory {
public Payment getZhifubaoPay() {
return new Zhifubao();
}
public Payment getWeixinPay() {
return new Weixin();
}
}
接着测试类:
public class Test {
public static void main(String[] args) {
PayFactory payFactory = new PayFactory();
payFactory.getWeixinPay().pay();
}
}
结果:使用微信支付
1.3静态工厂方法模式
将多工厂方法模式中的方法改为静态的即为静态工厂方法模式
总结:
工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
2、工厂方法模式
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
先创建支付接口:
public interface Payment {
public void pay();
}
接着创建两个实现类:
public class Zhifubao implements Payment{
@Override
public void pay() {
System.out.println("使用支付宝支付");
}
}
public class Weixin implements Payment{
@Override
public void pay() {
System.out.println("使用微信支付");
}
}
工厂类接口provider:
public interface Provider {
public Payment product();
}
两个工厂类:
public class WeixinPayFactory implements Provider{
@Override
public Payment product() {
return new Weixin();
}
}
public class ZhifubaoPayFactory implements Provider{
@Override
public Payment product() {
return new Zhifubao();
}
}
测试:
public class Test {
public static void main(String[] args) {
Provider provider = new ZhifubaoPayFactory();
provider.product().pay();
}
}
输出:使用支付宝支付