工厂方法模式是创建型设计模式之一。
定义一个用于创建对象的接口,让子类决定实例化哪个类,或者子类根据传入的参数不同而创建不同的类。
public abstract class Product {
//产品类的抽象方法,有具体的产品类去实现
public abstract void method();
}
public class ProductA extends Product {
//产品类A
@Override
public void method() {
System.out.println("这是具体的产品A");
}
}
public class ProductB extends Product{
//产品类B
@Override
public void method() {
System.out.println("这是具体的产品B");
}
}
public abstract class Factory{
/**
* 抽象工厂方法
* 具体产生什么由子类去实现
*/
public abstract Product createProduct();
}
public class MakeFactory extends Factory {
//工厂类的实现类,在这只生产A产品
@Override
public Product createProduct() {
return new ProductA();
}
}
public class Client {
public static void main(String[] args){
MakeFactory factory = new MakeFactory();
ProductA productA = (ProductA) factory.createProduct();
}
}
通过以上方法可以产生一个ProductA对象,但是,不能产生ProductB对象。
我们可以这样做:
public abstract class Factory{
/**
* 抽象工厂方法
* 具体产生什么由子类去实现
*/
public abstract Product createProduct(String product);
}
public class MakeFactory extends Factory {
@Override
public Product createProduct(String product) {
Product product1=null;
switch (product){
case "productA":product1 = new ProductA();
break;
case "productB":product1 = new ProductB();
break;
}
return product1;
}
}
public class Client {
public static void main(String[] args){
MakeFactory factory = new MakeFactory();
ProductA productA = (ProductA) factory.createProduct("productA");
}
}
这样,我们就可以根据传入的参数不同,创建不同的对象。但是,当我们需要生产的对象比较多时,我们是不是需要switch case许多次?我们是不是需要改原来的代码?Java中类的加载可以更好地解决这个问题。
public abstract class Factory{
/**
* 抽象工厂方法
* 具体产生什么由子类去实现
*/
public abstract <T extends Product> T createProduct(Class<T> tClass);
}
public class MakeFactory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> tClass) {
Product p = null;
try {
p= (Product) Class.forName(tClass.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) p;
}
}
public class Client {
public static void main(String[] args){
MakeFactory factory = new MakeFactory();
ProductA productA = (ProductA) factory.createProduct(ProductA.class);
}
}
此时,无论我们的产品有多少,都是可以产生的。
代码有许多不足之处,需要改进,请谅解。