工厂模式是我们最常用的实例化对象的模式了,使用工厂模式可以给系统带来更大的拓展性和更小的修改量。
1,普通工厂模式。
普通工厂模式用例图
首先我们创建phone接口
public interface Phone {
void call();
}
phone有打电话的功能
其次,我们创建实现类
public class HuaWeiPhone implements Phone {
@Override
public void call() {
Log.i("tag:","华为手机打电话");
}
}
public class XiaomiPhone implements Phone{ @Override public void call() { Log.i("tag:","小米手机打电话"); } }
最后我们创建工厂类其次,我们创建实现类public class PhoneFactory { public Phone creatPhone(String phoneName){ if (phoneName.equals("华为")){ return new HuaWeiPhone(); }else if (phoneName.equals("小米")){ return new XiaomiPhone(); }else { Log.i("tag:","工厂暂时没有这个手机型号"); return null; } } }
最后我们测试一下public class Test { public static void main(String[] args) { PhoneFactory phoneFactory=new PhoneFactory(); Phone huawei = phoneFactory.creatPhone("华为"); Phone xiaomi = phoneFactory.creatPhone("小米"); huawei.call(); xiaomi.call(); } }
输出:tag:华为手机打电话
tag:小米手机打电话
以上就是一个普通工厂模式
2.工厂方法模式
定义:定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象
工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况
下引进新的产品。 ---来自百度百度
可以看到工厂方法模式相比简单工厂,多定义了一个工厂接口,废话不说,直接上代码,仍然举上面的例子这里我们定义了一个IFactory 工厂接口类
public interface IFactory { Phone creatPhone(); }
然后创建相对应的实现类,实现工厂接口
public class HuaweiFactory implements IFactory { @Override public Phone creatPhone() { return new HuaWeiPhone(); } }
public class XiaoMiFactory implements IFactory { @Override public Phone creatPhone() { return new XiaoMiPhone(); } }
最后我们测试一下
public class Test { public static void main(String[] args) { IFactory huaweiFactory=new HuaweiFactory(); Phone phone = huaweiFactory.creatPhone(); phone.call(); IFactory xiaomiFactory=new XiaoMiFactory(); Phone phone1 = xiaomiFactory.creatPhone(); phone1.call(); } }
输出:tag:华为手机打电话
tag:小米手机打电话
以上是工厂方法模式的简单应用,可以看出,客户端使用时,只需要去调用具体的工厂实现类即可,省去了if else的判断
工厂方法经常用在以下两种情况中:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。