定义
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且通过使用一个共同的接口指向新创建的对象,创造型设计模式,提供了一种创建对象的最佳方式。
使用场景
任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象则无需使用工厂模式。
优点
1.调用者想创建一个对象,只要知道其名称即可。
2.屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
1.每增加一个产品时,需要增加一个具体类和对象实现工厂,同时引入抽象层,导致类结构的复杂化。
在Android中的应用
Activity的onCreate()方法:不同的Activity调用相同的onCreate()中setContentView()设置成不同的view。
package 工厂模式;
public class 工厂模式 {
public static void main(String[] args) {
AudiFactory factory = new AudiCarFactory();
AudiCar q3 = factory.createAudiCar(AudiQ3.class);
q3.drive();
q3.selfNavigation();
AudiCar q5 = factory.createAudiCar(AudiQ5.class);
q5.drive();
q5.selfNavigation();
AudiCar q7 = factory.createAudiCar(AudiQ7.class);
q7.drive();
q7.selfNavigation();
}
}
package 工厂模式;
public abstract class AudiCar {
public abstract void drive();
public abstract void selfNavigation();
}
package 工厂模式;
public class AudiCarFactory extends AudiFactory {
@Override
public <T extends AudiCar> T createAudiCar(Class clz) {
// TODO Auto-generated method stub
AudiCar car = null;
try {
car = (AudiCar) Class.forName(clz.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (T) car;
}
}
package 工厂模式;
public abstract class AudiFactory {
public abstract <T extends AudiCar> T createAudiCar(Class clz);
}
package 工厂模式;
public class AudiQ3 extends AudiCar {
@Override
public void drive() {
// TODO Auto-generated method stub
System.out.println("Q3 开始启动");
}
@Override
public void selfNavigation() {
// TODO Auto-generated method stub
System.out.println("Q3 开始自动巡逻");
}
}
package 工厂模式;
public class AudiQ5 extends AudiCar {
@Override
public void drive() {
// TODO Auto-generated method stub
System.out.println("Q5 开始启动");
}
@Override
public void selfNavigation() {
// TODO Auto-generated method stub
System.out.println("Q5 开始自动巡逻");
}
}
package 工厂模式;
public class AudiQ7 extends AudiCar {
@Override
public void drive() {
// TODO Auto-generated method stub
System.out.println("Q7 开始启动");
}
@Override
public void selfNavigation() {
// TODO Auto-generated method stub
System.out.println("Q7 开始自动巡逻");
}
}