设计模式之抽象工厂模式
来源:互联网 发布:矩阵没有分配律 编辑:程序博客网 时间:2024/06/16 12:44
定义
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
..
结构图
代码框架
//抽象类A或者接口Apublic abstract class AbstractProductA {}//抽象类B或者接口Bpublic abstract class AbstractProductB {}//A和B的一系列产品public class ProductA1 extends AbstractProductA{}public class ProductA2 extends AbstractProductA{}public class ProductB1 extends AbstractProductB{}public class ProductB2 extends AbstractProductB{}//定义工厂方法public abstract class AbstractFactory { public abstract AbstractProductA createProductA(); public abstract AbstractProductB createProductB();}public class ConcreteFactory1 extends AbstractFactory { @Override public AbstractProductA createProductA() { // TODO Auto-generated method stub return new ProductA1(); } @Override public AbstractProductB createProductB() { // TODO Auto-generated method stub return new ProductB1(); }}public class ConcreteFactory2 extends AbstractFactory{ @Override public AbstractProductA createProductA() { // TODO Auto-generated method stub return new ProductA2(); } @Override public AbstractProductB createProductB() { // TODO Auto-generated method stub return new ProductB2(); }}//Client类public class Client { public static void main(String[] args) { //以ConcreteFactory1为例 AbstractFactory factory = new ConcreteFactory1();// AbstractFactory factory = new ConcreteFactory2(); AbstractProductA productA = factory.createProductA(); AbstractProductB productB = factory.createProductB(); }}
优点和缺点
第一点:易于交换产品系列,AbstractFactory factory = new ConcreteFactory1();在一个产品应用中啦,只需要初始化的时候出现一次就可以了,这就使得改变一个应用的具体的工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
第一点:它让具体的创建实例过程和客户端Client分离,客户端是通过他们的抽象接口操作实例,产品的具体类名,如(ProductA1,Product1A2,ProductB1..)。也被具体工厂的实现分离,不会出现在客户代码中
缺点:如果需求要改了,需要增加新的功能,比如添加新的产品C,那么就要添加好几个类,放项目工程很大的时候,就需要添加很多类。还有就是不止有一个Client客户端,会有很多个,那么比如的AbstractFactory factory = new ConcreteFactory1();就会调用很多次,比如100个Client就要调用100次.
解决方案
一:用简单工厂来封装:
结构图
代码
public class SimpleFactory { private static String db; public SimpleFactory(String s) { // TODO Auto-generated constructor stub this.db = s; } public static AbstractProductA createProductA() { AbstractProductA result = null; switch (db) { case "1": result = new ProductA1(); break; case "2": result = new ProductA2(); default: break; } return result; } public static AbstractProductB createProductB() { AbstractProductB result = null; switch (db) { case "1": result = new ProductB1(); break; case "2": result = new ProductB2(); default: break; } return result; }}public class Client { public static void main(String[] args) { SimpleFactory factory = new SimpleFactory("1"); //以产品1为例 AbstractProductA productA = factory.createProductA(); AbstractProductB productB = factory.createProductB(); }}
二:利用反射机制,动态的生成需要的产品类
public class AbstractFactory{ private String s; public AbstractFactory(String s) { this.s = s; } public AbstractProductA createProductA() { return (AbstractProductA) Class.forName("ProductA"+s).newInstance(); } public AbstractProductB createProductB() { return (AbstractProductB) Class.forName("ProductB"+s).newInstance(); }}class Client{ public static void main() { AbstractFactory factory = new AbstractFactory("1"); AbstractProductA productA = factory.createProductA(); AbstractProductB productB = factory.createProductB(); }}
在客户端没有出现,ProductA等具体类的字样,达到了解耦的目的…
0 0
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之-抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- Shiro入门程序
- Eloquent JavaScript 笔记 一、Values, Types, and Operators
- webpack2基本概念——入口(entry)002
- HDU 4352 XHXJ's LIS(*数位DP 记忆化搜索 待整理)
- oracle exp&imp之IMP-00037: Character set marker unknown
- 设计模式之抽象工厂模式
- java中集合中删除特定元素
- Balsamiq Mockups完全手册
- 文件系统特性
- video.js使用笔记(1)
- Android UiAutomator UiCollection类
- 批处理逆序重命名当前目录下的png文件
- 关于gcc显示问题
- 解决注册表搜索假死的办法【最有效的】