标签:接口 new 笔记 alt cat tst 创建 常见 nts
定义一个用于创建对象的接口,让子类决定实例化哪个类。
在任何需要生产复杂的对象的地方都可以使用工厂方法模式。复杂对象适用于使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。
/**
* 抽象产品类
*/
public abstract class Product {
/**
* 产品类的抽象方法,
* 由具体的产品类去实现
*/
public abstract void method();
}
/**
* 具体的产品类
*/
public class ConcreteProductA extends Product {
@Override
public void method() {
System.out.println("我是具体的产品 A");
}
}
/**
* 具体的产品类
*/
public class ConcreteProductB extends Product {
@Override
public void method() {
System.out.println("我是具体的产品 B");
}
}
工厂常用的有三种方式
工厂
/**
* 抽象工厂类
*/
public abstract class Factory {
/**
* 抽象工厂方法,
* 又具体的抽象工厂类实现
*/
public abstract Product createFactory();
}
具体工厂
/**
* 具体的工厂类:最常见的方式,需要哪个就生产哪个
*/
public class ConcreteFactory extends Factory {
@Override
public Product createFactory() {
// return new ConcreteProductB();
return new ConcreteProductA();
}
}
这种工厂模式比较常见,需要哪一个产品就生成哪一个。
工厂
public abstract class Factory {
/**
* 创建产品
* 具体生产什么由子类去实现
*/
public abstract <T extends Product> T createProduct(Class<T> clazz);
}
具体工厂
/**
* 具体工厂类
*/
public class ConcreteFactory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> clazz) {
Product product = null;
try {
product = (Product) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
}
这种方式,通过反射方式来更加简洁地生产具体产品对象,这时,需要在工厂方法的参数列表中传入一个Class类来决定是哪一个产品类。
工厂
/**
* 抽象工厂类
*/
public abstract class Factory {
/**
* 抽象工厂方法,
* 又具体的抽象工厂类实现
*/
public abstract Product createFactory();
}
具体工厂
工厂A
public class ConcreteFactoryA extends Factory {
@Override
public Product createFactory() {
return new ConcreteProductA();
}
}
工厂B
public class ConcreteFactoryB extends Factory {
@Override
public Product createFactory() {
return new ConcreteProductB();
}
}
这种拥有多个工厂的方式我们称为多工厂方法模式。这种模式,为每一个产品都定义一个具体的工厂。
当我们的工厂只有一个的时候,我们可以简化掉抽象类。将对于的工厂方法修改为静态方法。
public class Factory {
public static Product createProduct() {
return new ConcreteProductA();
}
}
像这种方式我们称为简单工厂模式或静态工厂模式。
标签:接口 new 笔记 alt cat tst 创建 常见 nts
原文地址:https://www.cnblogs.com/gxl1995/p/9055241.html