设计模式——抽象工厂模式
2016-07-18 09:54
148 查看
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
优点:
1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
角色:
AbstractFactory(抽象工厂):声明一个接口,这个接口中包含创建抽象产品对象的方法。
ConcreteFactory(具体工厂):实现创建具体产品对象的方法。
AbstractProduct(抽象产品):声明一个接口,这个接口包含产品对象类型。
ConcreteProduct(具体产品):定义一个产品对象,这个产品对象是由相关的具体工厂创建的。
应用场景:
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
2、系统中有多于一个的产品族,而每次只使用其中某一产品族。
3、属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。、
代码实现:
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
优点:
1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
角色:
AbstractFactory(抽象工厂):声明一个接口,这个接口中包含创建抽象产品对象的方法。
ConcreteFactory(具体工厂):实现创建具体产品对象的方法。
AbstractProduct(抽象产品):声明一个接口,这个接口包含产品对象类型。
ConcreteProduct(具体产品):定义一个产品对象,这个产品对象是由相关的具体工厂创建的。
应用场景:
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
2、系统中有多于一个的产品族,而每次只使用其中某一产品族。
3、属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。、
代码实现:
package com.sun.abstractfactory; /** * 抽象工厂 * @author work * */ public interface IFactory { public IUserService createUserService(); }
package com.sun.abstractfactory; /** * 抽象产品 * @author work * */ public interface IUserService { public void insert(User user); public User getUser(int id); }
package com.sun.abstractfactory; /** * 具体工厂mysql * @author work * */ public class MysqlFactory implements IFactory{ @Override public IUserService createUserService() { // TODO Auto-generated method stub return new MysqlUser(); } }
package com.sun.abstractfactory; /** * 具体产品mysql * @author work * */ public class MysqlUser implements IUserService{ @Override public void insert(User user) { // TODO Auto-generated method stub System.out.println("mysql"); } @Override public User getUser(int id) { // TODO Auto-generated method stub System.out.println("mysql........get....."); User user = new User(); user.setId(1); user.setName("xx"); return user; } }
package com.sun.abstractfactory; /** * 具体工厂sqlserver * @author work * */ public class SqlServerFactory implements IFactory{ @Override public IUserService createUserService() { // TODO Auto-generated method stub return new SqlServerUser(); } }
package com.sun.abstractfactory; /** * 具体产品sqlserver * @author work * */ public class SqlServerUser implements IUserService{ @Override public void insert(User user) { // TODO Auto-generated method stub System.out.println("sqlserver"); } @Override public User getUser(int id) { // TODO Auto-generated method stub System.out.println("sqlserver........get....."); User user = new User(); user.setId(1); user.setName("xx"); return user; } }
package com.sun.abstractfactory; /** * 用户 * @author work * */ public class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.sun.abstractfactory; public class Test { public static void main(String[] args) { IFactory f = new MysqlFactory(); IUserService s = f.createUserService(); s.getUser(1); } }
相关文章推荐
- 面试准备
- JSP常用跳转方式
- IONIC----04.ionicModal
- Arithmetic problem | 海拔图最多能接住多少(面积)雨水
- 这样写简历,不愁被问职业规划!
- Leetcode 292 :Nim Game
- 第一届C4参赛感受
- Unity UGUI —— 鼠标穿透UI问题(Unity官方的解决方法)
- TCP通信(三)——数据读写
- 百度提取码查看
- Android自定义星星评分控件,高效
- hdoj 4135 Co-prime<直接模拟||队列技巧--容斥原理>
- Gradle sync failed: Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory
- myshare 4.linux软件安装与java开发环境搭建&静态网站制作
- 使用Small创建iOS工程目录
- Java多线程方面的文章汇总:
- nginx反向代理配置
- java知识复习1
- 算法导论之平摊分析(动态表)
- HBase高级用法