文章目录
- 1. 概念
- 2. 实际的应用
1. 概念
FactoryMethod 模式是设计模式中应用最为广泛的模式,在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。 FactoryMethod 解决的就是这个问题,它通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。
听不懂是吧?下面直接举例说明:
2. 实际的应用
注:图中原作者出现笔误,BMW错拼成了BWM
上图中①是BMW的产品接口,②是产品工厂的接口。
代码实现:
(1)开发人员A的工作
接口BMW.java:
package day09;
/*** 宝马车的产品接口* @author 14532**/
public interface BMW {//产品的信息介绍//车的发动方式void showInfo();
}/*** 构建具体的车的类* @author 14532**/
class BMW3 implements BMW{@Overridepublic void showInfo() {System.out.println("这个是宝马3系车");}
}class BMW5 implements BMW{@Overridepublic void showInfo() {System.out.println("这个是宝马5系车"); }
}class BMW7 implements BMW{@Overridepublic void showInfo() {System.out.println("这个是宝马7系车"); }
}
接口BMWFactory.java:
package day09;
/*** 汽车生产工厂接口* @author 14532**/
public interface BMWFactory {BMW productBMW();
}/*** 实现具体的车型的生产工厂* @author 14532**/
class BMW3Factory implements BMWFactory{@Overridepublic BMW productBMW() {System.out.println("生产宝马3系车");return new BMW3();}
}class BMW5Factory implements BMWFactory{@Overridepublic BMW productBMW() {System.out.println("生产宝马5系车");return new BMW5();}
}class BMW7Factory implements BMWFactory{@Overridepublic BMW productBMW() {System.out.println("生产宝马7系车");return new BMW7();}
}
(2)开发人员B的工作:
Test.java:
package day09;public class Test2 {public static void main(String[] args) {//这是开发人员B的工作BMW b3 = new BMW3Factory().productBMW();b3.showInfo();BMW b5 = new BMW5Factory().productBMW();b5.showInfo();BMW b7 = new BMW7Factory().productBMW();b7.showInfo();}}
运行结果:
如果现在需要对宝马3系的车进行改造,改成宝马3i,该如何实现:
BMW.java中class BMW3 implements BMW{
改成class BMW3i implements BMW{
BMWFactory.java中return new BMW3();
改成return new BMW3i();
为了区别改造的,在类BMW3Factory中添加一段输出System.out.println("改造3系车,定名为BMW3i型号");
更改后的代码:
(1)开发人员A的工作产生了变化:
接口BMW.java:
package day09;
/*** 宝马车的产品接口* @author 14532**/
public interface BMW {//产品的信息介绍//车的发动方式void showInfo();
}/*** 构建具体的车的类* @author 14532**/
class BMW3i implements BMW{//更改为BMW3i@Overridepublic void showInfo() {System.out.println("这个是宝马3系车");}
}class BMW5 implements BMW{@Overridepublic void showInfo() {System.out.println("这个是宝马5系车");}
}class BMW7 implements BMW{@Overridepublic void showInfo() {System.out.println("这个是宝马7系车");}
}
接口BMWFactory.java:
package day09;
/*** 汽车生产工厂接口* @author 14532**/
public interface BMWFactory {BMW productBMW();
}/*** 实现具体的车型的生产工厂* @author 14532**/
class BMW3Factory implements BMWFactory{//在BMW3Factory中改造BMW3为BMW3i@Overridepublic BMW productBMW() {System.out.println("生产宝马3系车");System.out.println("改造3系车,定名为BMW3i型号");return new BMW3i();//返回BMW3i}}class BMW5Factory implements BMWFactory{@Overridepublic BMW productBMW() {System.out.println("生产宝马5系车");return new BMW5();}}class BMW7Factory implements BMWFactory{@Overridepublic BMW productBMW() {System.out.println("生产宝马7系车");return new BMW7();}}
(2)开发人员B的工作没有变化:
Test.java:
package day09;public class Test2 {public static void main(String[] args) {//这是开发人员B的工作BMW b3 = new BMW3Factory().productBMW();b3.showInfo();BMW b5 = new BMW5Factory().productBMW();b5.showInfo();BMW b7 = new BMW7Factory().productBMW();b7.showInfo();}}
输出结果:
通过工厂把new对象给隔离,通过产品的接口可以接收不同实际产品的实现类。实现的类名的改变不影响其他合作开发人员的编程。