定义:
定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化,它把实例化的工作推迟到子类中实现。
组成角色:
1、抽象产品(Product):描述具体产品的公共接口
2、具体产品(Concrete Product):描述生产的具体产品
3、抽象工厂(Factory):描述具体工厂的公共接口
4、具体工厂(ConcreteFactory):实现工厂方法创建产品的实例
什么情况下适合工厂模式:
1:有一组类似的对象需要创建
2:在编码时不能预见需要哪种类的实例
3:系统需要考虑拓展性,不应依赖于产品类实例如何被创建、组合和表达的细节
类图如下:
抽象分析:
1、创建抽象产品Product
public interface Product {
public void show();
}
2、创建具体产品ProductA和ProductB
public class ProductA implements Product{
@Override
public void show() {
System.out.println("产品A");
}
}
public class ProductB implements Product{
@Override
public void show() {
System.out.println("产品B");
}
}
3、创建抽象工厂Factory
public interface Factory {
public Product createProduct();
}
4、创建具体工厂FactoryA和FactoryB
public class FactoryA implements Factory{
@Override
public Product createProduct() {
return new ProductA();
}
}
public class FactoryB implements Factory{
@Override
public Product createProduct() {
return new ProductB();
}
}
5、测试代码如下:
public class TestMain {
public static void main(String[] args) {
Factory factoryA = new FactoryA();
factoryA.createProduct().show();
Factory factoryB = new FactoryB();
factoryB.createProduct().show();
}
}
6、结果如下:
示例分析:
宝马汽车有好多不同的型号,不同型号的宝马汽车是由不同的工厂生产的,这里我们模拟一下不同的工厂生产不同型号的宝马车的过程。
1、一个抽象产品类BMW
public interface BMW {
}
2、两个具体的产品类BMW350和BM700型号的宝马
public class BMW350 implements BMW{
public BMW350(){
System.out.println("制造宝马350");
}
}
public class BMW700 implements BMW{
public BMW700(){
System.out.println("制造宝马700");
}
}
3、一个抽象工厂类BMWFactory
public interface BMWFactory {
public BMW createBMW();
}
4、两个具体的工厂类BMW350Factory和BMW700Factory
public class BMW350Factory implements BMWFactory{
public BMW createBMW(){
return new BMW350();
}
}
public class BMW700Factory implements BMWFactory{
public BMW createBMW(){
return new BMW700();
}
}
5、测试方法如下:
public class TestMethod {
public static void main(String[] args) {
BMWFactory bmw350 = new BMW350Factory();
BMWFactory bmw700 = new BMW700Factory();
bmw350.createBMW();
bmw700.createBMW();
}
}