注意:绿色虚线箭头为实现关系、白色虚线箭头为依赖关系、平行四边形实线箭头为关联关系、蓝色实线箭头为继承关系。
同时简单说明依赖和关联关系:在Java语言中,依赖关系体现为把依赖的类作为方法的返回值/入参、局部变量,或者对静态方法的调用等。而关联关系一般把关联的类作为自己的成员变量。
2、工厂方法模式定义Define an interface for creating an object, but let subclasses decide which class to instantiate.
Factory Method lets a class defer instantiation to subclasses.
意思是:为创建对象定义一个接口,但是让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到子类。
在工厂方法模式中:
1)Product抽象产品类负责定义子类的共性,子类产品是相互独立的实现自己所需细节。
2)Factory是抽象工厂接口,一般与抽象产品类为依赖关系;如果是普通工厂方法模式Factory就是一个普通的类,一般与抽象产品类为关联关系。具体工厂类就是独立地创建相应地具体产品。
3、工厂方法模式优点1、扩展性好。在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可“拥抱变化”。
2、屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。
3、典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。
所谓延迟加载,就是使用缓存的作用。如果集合map缓存到,可以从里面获取;否则新建后缓存并返回。
public class Factory {
private static final Map prMap = new HashMap<>();
public static synchronized Product createProduct(String type) throws Exception{
Product product = null;
if (prMap.containsKey(type)) {
product = prMap.get(type);
} else {
if (type.equals("Product1")) {
product = new ConcreteProduct1();
} else {
product = new ConcreteProduct2();
}
prMap.put(type, product);
}
return product;
}
}
2、多工厂类模式(结构图如上面一)
1)Product产品类接口
public interface Product {
void operation();
}
2)ConcreteProduct1
public class ConcreteProduct1 implements Product {
@Override
public void operation() {
System.out.println("我是产品1");
}
}
3)ConcreteProduct2
public class ConcreteProduct2 implements Product {
@Override
public void operation() {
System.out.println("我是产品2");
}
}
4)Factory工厂接口
public interface Factory {
Product createProduct();
}
5)ConcreteFactory1
public class ConcreteFactory1 implements Factory{
@Override
public Product createProduct() {
return new ConcreteProduct1();
}
}
6)ConcreteFactory2
public class ConcreteFactory2 implements Factory {
@Override
public Product createProduct() {
return new ConcreteProduct2();
}
}
7)Client测试类
public class Client {
public static void main(String[] args) {
Factory factory = null;
factory = new ConcreteFactory1();
Product product1 = factory.createProduct();
product1.operation();
factory = new ConcreteFactory2();
Product product2 = factory.createProduct();
product2.operation();
}
}
结果:
我是产品1 我是产品2 Process finished with exit code 0接口只关心子类共性操作,抽象类关注子类的共性(包括共性细节),抽象类也会实现接口。 点点赞,谢谢,你的支持将是我最大的动力!!!



