工厂方法模式
定义
Define an interface for creating an object,but let subclasses decide which class to
instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的
接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)
应用场景
当应用程序需要非常高的灵活性和扩展性的时候可以多使用工厂方法模式,在不同的工厂类中管理同一类型的对象实化,可以减少实现类的多样性造成程序各种操作方法的耦合。在指定的工厂类中只实例化某一种品类的对象,肯定会比程序到处都new要更容易管理。例如,对数据库的连接对象,我们可以通过不同的工厂类来实例化实现了不同数据库支持的Connection对象,如果需要扩展数据库的支持,只需要加个对应的Connection和Factory即可。当然,使用抽象工厂能更好地进行扩展。
代码示例
package factorymethod;
/**
* 工厂方法模式场景
* @author 谢仲东 2018/8/6 20:58
* Description:
*/
public class FactoryMethodImpl {
public static void main(String[] args) {
Mobilephone phone1 = MobilephoneFactory.createMobilePhone(IntelligentMobilephone.class);
Mobilephone phone2 = MobilephoneFactory.createMobilePhone(GeriatricMobilephone.class);
phone1.ring();
phone2.ring();
phone1.dial("110");
phone2.dial("110");
/*
output:
智能手机响铃
老人手机响铃
智能手机拨号:110
老人手机拨号:110
*/
}
}
/**
* 手机接口
*/
interface Mobilephone {
void ring();
void dial(String number);
}
/**
* 智能手机实现类
*/
class IntelligentMobilephone implements Mobilephone{
@Override
public void ring() {
System.out.println("智能手机响铃");
}
@Override
public void dial(String number) {
System.out.println("智能手机拨号:" + number);
}
}
/**
* 老人手机实现类
*/
class GeriatricMobilephone implements Mobilephone{
@Override
public void ring() {
System.out.println("老人手机响铃");
}
@Override
public void dial(String number) {
System.out.println("老人手机拨号:" + number);
}
}
/**
* 手机工厂
*/
class MobilephoneFactory {
public static <T extends Mobilephone> T createMobilePhone(Class<T> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}