介绍: 在运行期动态的决定将哪个类实例化,提高灵活性
分类:
1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
代码实现
1. 简单工厂模式(Simple Factory )
简单工厂模式(Simple Factory Pattern ):又称静态工厂方法模式(Static Factory Method Pattern),它属于创建型模式,在简单工厂模式中,可以根据入参的不同返回不同的实例. 简单工厂模式专门用来定义一个类负责创建其它类的实例,被创建类通常具共同的父类(extends or implements).
代码实现如下:
1.通过if.switch实现
public interface Iproduct {}
public class Computer implements Iproduct {
public Computer() {
System.out.println("Computer");
}
}
public class TV implements Iproduct {
public TV() {
System.out.println("TV");
}
}
public class Factory {
public static Iproduct createProduct(String productName) {
Iproduct product;
switch (productName) {
case "TV":
product = new TV();
break;
case "Computer":
product = new Computer();
break;
default:
product = null;
break;
}
return product;
}
}
测试如下:
public class Customer {
public static void main(String[] a) {
Iproduct product = Factory.createProduct("TV");
System.out.println(product);
}
}
输出如下: TV
缺点:扩展性差,每加入一种product,必须修改Factory类
2.通过反射来实现
public class Factory2 {
public static Iproduct createProduct(String className) throws Exception {
try {
return (Iproduct)Class.forName(className).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
throw new Exception("not product found");
}
}
缺点:扩展性差,客户端必须记住全部完整类路径
3.引入.properties文件 来进行className 与alias 进行映射
public class Factory3 {
private static Map<String, String> map = new HashMap<String, String>();
static {
InputStream res = Factory3.class.getClassLoader().getResourceAsStream("product.properties");
Properties properties = new Properties();
try {
properties.load(res);
properties.keySet().forEach(property -> map.put((String) property, (String) properties.get(property)));
} catch (IOException e) {
e.printStackTrace();
}
}
public static Iproduct createProduct(String productName) {
try {
return (Iproduct) Class.forName(map.get(productName)).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
测试输出如下 TV
2.工厂方法模式(FACTORY METHOD )
定义一堆产品.每个产品 由一个专门的工厂来制造,扩展时,无需修改原来的逻辑,只需要实现Factory 接口即可
代码如下:
/**
* 两个接口
*/
public interface Factory {
Product create();
}
public interface Product {
}
public class TV implements Product{
public TV(){
System.out.println("TV");
}
}
public class TVFactory implements Factory{
@Override
public Product create() {
return new TV();
}
}
//测试
public class Test {
public static void main(String a){
Factory factory= new TVFactory();
factory.create();
}
}
输出: TV
3.抽象工厂模式(Abstract Factory )
//TODO 目前没有用到.待补充