这是我参与更文挑战的第9天,活动详情查看: 更文挑战
定义
定义一个用于创建对象的借口,让子类决定实例化那个类
使用场景
在需要创建复杂对象的地方「比如需要更具某些特性创建不同的对象,但是创建的这些对象他们都有很多共性,都可以使用工厂方法模」复杂对象想适合用工厂模式,用new就可以完成创建的对象不需要用工厂模式。
适用于一个类不知道它所需要的对象的类;一个类通过其子类来指定创建哪个对象;将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定。
代码
抽象产品类:
/**
* 抽象产品类
*/
public abstract class Product {
//产品类的抽象方法,由具体的产品类去实现
public abstract void method();
}
复制代码
具体产品类:
/***
* 具体产品类A
*/
public class ProductA extends Product{
@Override
public void method() {
System.out.println("我是具体产品A");
}
}
/***
* 具体产品类B
*/
public class ProductB extends Product{
@Override
public void method() {
System.out.println("我是具体产品类B");
}
}
复制代码
具体产品类可以根据需求创建多个不同的。
抽象方法类:
/**
* 抽象工厂类
* 为了直观感受工厂方法模式, 写了两种抽象方法获取产品类
*/
public abstract class Factory {
public abstract <T extends Product> T createProduct(Class<T> cla); //通过反射动态创建
public abstract Product createProduct(String type); //通过type类型创建 产品对象类
}
复制代码
具体工厂类
/***
* 具体抽象工厂
*/
public class ConcreateFactory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> cla) {
Product product = null;
try {
product = (Product) Class.forName(cla.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
@Override
public Product createProduct(String type) {
switch (type) {
case "A":
return new ProductA();
case "B":
return new ProductB();
}
return null;
}
}
复制代码
接下来看下测试类:
public class ClientTest {
public static void main(String[] args) {
Factory factory = new ConcreateFactory();
Product productA = factory.createProduct("A");
Product productB = factory.createProduct(ProductB.class);
productA.method();
productB.method();
}
}
复制代码
输出
通过代码可以看到,我们只需要传递我们想要生成的对象,或者type类型就可以获取到,并且执行对应的方法,如果后续需要扩展,则不用考虑些很多判断,这就是面向对象六大原则相呼应了
面向对象六大原则
总结
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
优点
- 快速扩展
- 完美体现开闭原则,对于扩展是开放的,对于修改是封闭的。
缺点
- 会有很多产品类,增加代码量
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END