一,直接上类图,初步理解抽象工厂

注:图片来源为我在浏览器里找的,看样子是csdn里的图,有水印
形象理解这张图的每个类的意思
AbstractFactory
想象一个工厂,非常全能,能够生产很多种不同的产品,这个工厂的名字就是AbstractFactory
ConcreteFactory
这个工厂要生产不同的产品,当然要开不同的产品线,确保每种产品的正常生产,于是每条生产线的名称就是ConcreteFactory,易得每条生产线都是工厂的"儿子"
AbstractProduct
客户告诉工厂,我想要一些产品,是什么产品呢,也不细说,只是告诉你这些产品有一些共同的特点,即AbstractProduct
ConcreteProduct
客户告诉工厂他所想要的具体产品,即ConcreteProduct们,要求工厂生产,工厂则根据客户想要的产品,用不同的生产线进行生产
二,题目背景
某界面可以使用不同风格的控件:按钮Button有Window风格的子类WindowButton 和Motif风格的子类树MotifButton;
文本框TextBox也有Windows风格文本框WindowsTextBox 和Motif风格的文本框MotifTextBox ,AbstractFactory 是抽象工厂接口
三,思考
思考这个问题,刚才的uml图思考:
谁是**AbstractFactory,****ConcreteFactory,****AbstractProduct,**ConcreteProduct
我们可以倒推
看题目,我们想要的最终产物有4个
WindowButton 和MotifButton
WindowsTextBox 和MotifTextBox
那这些最终产物就是ConcreteProduct
那能找到最终产物的共同特点吗? 能
Button 和TextBox
那这些共同特点就是AbstractProduct
那工厂是做什么的?
刚刚有提到:客户告诉工厂他所想要的具体产品,即ConcreteProduct们,工厂则根据客户想要的产品,用不同的生产线进行生产
所以ConcreteProduct由生产线ConcreteFactory得到
所以Button 和TextBox前面的
Window和Motif
为ConcreteFactory
那最后就是要一个工厂来包容我们的生产线ConcreteFactory,那就是AbstractFactory了
类图如下

不是很规整,但是我感觉意思应该是到位了**= ̄ω ̄=**
接下来是代码实现
AbstractProduct:
java
abstract class Button{};
abstract class TextBox{};
ConcreteProduct:
之button
java
class WindowButton extends Button {
public WindowButton(){
System.out.println("createWindowsButton");
}
}
class MotifButton extends Button {
public MotifButton(){
System.out.println("createMotifButton");
}
}
ConcreteProduct:
之Textbox
java
class WindowTextBox extends TextBox{
public WindowTextBox(){
System.out.println("createWindowTextBox");
}
}
class MotifTextBox extends TextBox{
public MotifTextBox(){
System.out.println("createMotifTextBox");
}
}
AbstractFactory:
java
interface AbstractFactory {
Button createButton();
TextBox createTextBox();
}
关键部分!!!核心,注意理解: ConcreteFactory:
java
class WindowFactory implements AbstractFactory {
public Button createButton(){
return new WindowButton();//创建WindowButton
}
public TextBox createTextBox(){
return new WindowTextBox();//创建WindowTextBox
}
}
class Motiffactory implements AbstractFactory {
public Button createButton(){
return new MotifButton();//创建MotifButton
}
public TextBox createTextBox(){
return new MotifTextBox();//创建MotifTextBox
}
}
客户来了:
java
class Dialog{
AbstractFactory factory;
Button button;
TextBox textBox;
public void setFactory(AbstractFactory factory) {
this.factory = factory;
}
public void init(){
button=factory.createButton();
textBox=factory.createTextBox();
}
}
主函数测试:
java
public class Main{
public static void main(String[] args){
Dialog dialog=new Dialog();
dialog.setFactory(new WindowFactory());
dialog.init();
dialog.setFactory(new Motiffactory());
dialog.init();
}
}
(无输入)输出:
createWindowsButton
createWindowTextBox
createMotifButton
createMotifTextBox
四,同理练习(含答案无解析)
某游戏界面中冬天的场景和夏天的场景不一样,例如:树Tree有子类冬天的树WinterTree 和夏天的树SummerTree
地板Floor也有冬天的地板WinterFloor 和夏天的地板SummerFloor ,AbstractFactory 是抽象工厂接口,请实现具体的冬天工厂WinterFactory 及夏天工厂SummerFactory 。
题目代码:
java
abstract class Tree{};
abstract class Floor{};
class WinterTree extends Tree{
public WinterTree(){
System.out.println("createWinterTree");
}
}
class SummerTree extends Tree{
public SummerTree(){
System.out.println("createSummerTree");
}
}
class WinterFloor extends Floor{
public WinterFloor(){
System.out.println("createWinterFloor");
}
}
class SummerFloor extends Floor{
public SummerFloor(){
System.out.println("createSummerFloor");
}
}
interface AbstractFactory {
Tree createTree();
Floor createFloor();
}
//请提交WinterFactory 及 SummerFactory 类
class GameDialog{
AbstractFactory factory;
Tree tree;
Floor floor;
public void setFactory(AbstractFactory factory) {
this.factory = factory;
}
public void init(){
tree=factory.createTree();
floor=factory.createFloor();
}
}
public class Main{
public static void main(String[] args){
GameDialog gameDialog=new GameDialog();
gameDialog.setFactory(new WinterFactory());
gameDialog.init();
gameDialog.setFactory(new SummerFactory());
gameDialog.init();
}
}
答案
uml类图

代码
java
class WinterFactory implements AbstractFactory{
public Tree createTree(){
return new WinterTree();
}
public Floor createFloor(){
return new WinterFloor();
}
}
class SummerFactory implements AbstractFactory{
public Tree createTree(){
return new SummerTree();
}
public Floor createFloor(){
return new SummerFloor();
}
}
输出
createWinterTree
createWinterFloor
createSummerTree
createSummerFloor
五,总结:抽象工厂的特点
- 产品族创建 :专注创建一组相关 / 配套的产品(比如 Window 风格的 Button+TextBox、Motif 风格的 Button+TextBox),而非单个产品;
- 抽象隔离:客户端只依赖抽象工厂 / 产品接口,不直接创建具体产品,彻底隔离创建逻辑;
- 风格统一 + 易切换:同一工厂产出的产品天然风格一致,切换产品族(如 Window→Motif)只需替换工厂实例,无需改客户端代码。
希望对大家有用,祝您开心~Hi~ o(* ̄▽ ̄*)ブ,有问题欢迎交流,俺会改的✊