Java 设计模式之工厂方法学习与掌握
Posted 邹奇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 设计模式之工厂方法学习与掌握相关的知识,希望对你有一定的参考价值。
定义
- 定义一个用于创建产品的接口,由子类决定生产什么产品。
优点
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足
迪米特法则
、依赖倒置原则
和里氏替换原则
。
迪米特法则:又叫作最少知识原则。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。
里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。
缺点
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度
- 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决
模式结构与实现
工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。
模式结构
该模式的4个角色如下:
- 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 createProduct() 来创建产品。
- 具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
总之,记住:工厂是跟产品相关的。工厂接口就定义创建产品的接口方法,返回类型为抽象产品类型;具体工厂就创建具体产品返回给调用方。
模式实现
首先是抽象工厂,如下:
package com.example.designmodedemo.principle.method_factory;
/**
* 抽象工厂
*/
public interface IFactory {
Product createProduct();// 工厂生成产品
}
具体工厂例子给出两个,如下:
package com.example.designmodedemo.principle.method_factory;
/**
* 具体工厂1
*/
public class Factory1 implements IFactory{
@Override
public Product createProduct() {
System.out.println(":> 我是工厂1,准备生产");
return new Product1();
}
}
package com.example.designmodedemo.principle.method_factory;
/**
* 具体工厂2
*/
public class Factory2 implements IFactory{
@Override
public Product createProduct() {
System.out.println(":> 我是工厂2,准备生产");
return new Product2();
}
}
然后是抽象产品,如下:
package com.example.designmodedemo.principle.method_factory;
public interface Product {
void show();// 显示产品信息
}
具体产品例子给出两个,如下:
package com.example.designmodedemo.principle.method_factory;
/**
* 具体产品1(由具体工厂1生产)
*/
public class Product1 implements Product{
@Override
public void show() {
System.out.println(":> 我是具体产品1,由具体工厂1生成");
}
}
package com.example.designmodedemo.principle.method_factory;
/**
* 具体产品2(由具体工厂2生产)
*/
public class Product2 implements Product{
@Override
public void show() {
System.out.println(":> 我是具体产品2,由具体工厂2生成");
}
}
调用方调用如下:
private void principle_method_factory() {
IFactory iFactory = null;
Product product = null;
iFactory = new Factory1();// 这里使用构造方法模拟测试
product = iFactory.createProduct();
product.show();
}
结果如下:
应用场景
- 客户不关心创建产品的细节,只关心产品的品牌
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
- 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
技术永不眠!我们下期见!
以上是关于Java 设计模式之工厂方法学习与掌握的主要内容,如果未能解决你的问题,请参考以下文章