- 抽象工厂模式
- 前言
- 一、抽象工厂模式概述
- 二、抽象工厂模式结构与实现
- 总结
前言
工厂方法模式中每个具体的工厂只需要生产一种具体产品,但在抽象工厂模式中一个具体的工厂可以生产一组相关的具体产品。一组产品称为产品族,产品族中的每一个产品都属于一个产品继承等级结构。
一、抽象工厂模式概述1.抽象工厂模式与工厂模式区别:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对对个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。
2.抽象工厂的定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
二、抽象工厂模式结构与实现1.抽象工厂模式结构
(1)AbstractFactory(抽象工厂):声明一组用于创建一族产品的方法。,每一种方法对应一种产品。
(2)ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成一个产品族。
(3)AbstractProduct(抽象产品):为每种产品声明接口,在抽象产品中声明产品所具有的业务方法。
(4)ConcreteProduct(具体产品):定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
2.结构图
3.代码示例:
在每个 *** 作系统中都有一个由图形组成的构件家族,可以通过一个抽象角色给出功能定义,而由具体子类给出不同 *** 作系统下的具体实现。如系统中包含两个产品等级结构,分别为Button与Text;同时3个产品族,即UNIX产品族,Linux产品族与Windows产品族。用抽象工厂模式实现。
(1)Button:按钮接口,充当抽象产品。
public interface Button { public void display(); }
(2)UnixButton:Unix按钮类,充当具体产品类
public class UnixButton implements Button { @Override public void display() { System.out.println("unix button..."); } }
(3)WinButton:Win按钮类,充当具体产品类
public class WinButton implements Button { @Override public void display() { System.out.println("Win Button..."); } }
(4)Text:文本接口,充当抽象产品
public interface Text { public void display(); }
(5)UnixText:Unix文本类,充当具体产品类
public class UnixText implements Text { @Override public void display() { System.out.println("Unix Text..."); } }
(6)WinText:Win文本类,,充当具体产品类
public class WinText implements Text { @Override public void display() { System.out.println("Win Text..."); } }
(7)AbstractFactory:抽象工厂接口
public interface AbstractFactory { Button createButton(); Text createText(); }
(8)UnixFactory:具体工厂类
public class UnixFactory implements AbstractFactory { @Override public Button createButton() { System.out.println("createButton被调用..."); return new UnixButton(); } @Override public Text createText() { System.out.println("createText被调用..."); return new UnixText(); } }
(9)WinFactory :具体工厂类
public class WinFactory implements AbstractFactory { @Override public Button createButton() { System.out.println("createButton被调用000"); return new UnixButton(); } @Override public Text createText() { System.out.println("createText被调用..."); return new UnixText(); } }
(10)测试类:
public class Demo { public static void main(String[] args) { WinButton winButton = new WinButton(); winButton.display(); UnixText unixText =new UnixText(); unixText.display(); UnixFactory unixFactory = new UnixFactory(); unixFactory.createButton(); unixFactory.createText(); WinFactory winFactory = new WinFactory(); winFactory.createButton(); winFactory.createText(); } }
总结
1.抽象工厂模式隔离了具体类的生成,更换一个具体的工厂变得就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的公共接口,只需要改变具体工厂的实例就可以在某种程度上改变整个软件系统的行为
2.当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象
3.增加新的产品族很方便,无需修改已有系统,符合开闭原则。
4.增加新的产品结构麻烦,需要较大的修改。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)