- 浏览: 23535 次
- 性别:
- 来自: 上海
文章分类
工厂方法模式或简单工厂关注的是单个产品对象的创建,比如创建CPU的工厂方法,它就只关心如何创建CPU对象,而创建主板的工厂方法,就只关心如何创建主板对象。
public interface AbstractFactory{
public AbstractProductA createProductA();
public AbstractProductB createProductB();
}
public interface AbstractProductA {
}
public interface AbstractProductB {
}
public class ProductA1 implements AbstractProductA {
}
public class ProductA2 implements AbstractProductA {
}
public class ProductB1 implements AbstractProductB {
}
public class ProductB2 implements AbstractProductB {
}
public class ConcreteFactory1 implements AbstractFactory {
public AbstractProductA createProductA() {
return new ProductA1();
}
public AbstractProductB createProductB() {
return new ProductB1();
}
}
public class ConcreteFactory2 implements AbstractFactory {
public AbstractProductA createProductA() {
return new ProductA2();
}
public AbstractProductB createProductB() {
return new ProductB2();
}
}
客户端代码可以如下:
AbstractFactory af = new ConcreteFactory1();
af.createProductA();
af.createProductB();
AbstractFactory在java中通常实现成为接口,具体的实现是在实现类中。
AbstractFactory定义的创建创建产品的方法可以看出是工厂方法,而这些工厂方法的实现就延迟到了具体的工厂里面。也就是说使用工厂方法来实现抽象工厂。
可以改造为使用参数的抽象工厂。
DAO模式实现的时候采用工厂方法和抽象工厂。
使用抽象工厂实现DAO模式
public abstract class DAOFactory{
public abstract OrderMainDAO createOrderMainDAO();
public abstract OrderDetailDAO createOrderDetailDAO();
}
public interface OrderMainDAO {
public void saveOrderMain();
}
public interface OrderDetailDAO {
public void saveOrderDetail();
}
public class RdbMainDAOImpl implements OrderMainDAO {
public void saveOrderMain() {
System.out.println("now in RdbMainDAOImpl");
}
}
public class RdbDetailDAOImpl implements OrderDetailDAO {
public void saveOrderDetail() {
System.out.println("now in RdbDetailDAOImpl");
}
}
public class XmlMainDAOImpl implements OrderMainDAO {
public void saveOrderMain() {
System.out.println("now in XmlMainDAOImpl");
}
}
public class XmlDetailDAOImpl implements OrderDetailDAO {
public void saveOrderDetail() {
System.out.println("now in XmlDetailDAOImpl");
}
}
public class RdbDAOFactory extends DAOFactory {
public OrderMainlDAO createOrderMainDAO() {
return new RdbMainDAOImpl();
}
public OrderDetailDAO createOrderDetailDAO() {
return new RdbDetailDAOImpl();
}
}
public class XmlDAOImpl extends DAOFactory {
public OrderMainDAO createOrderMainDAO() {
return new XmlMainDAOImpl();
}
public OrderDetailDAO createOrderDetailDAO() {
return new XmlDetailDAOImpl();
}
}
客户端可以用下面的代码:
DAOFactory df = new RdbDAOFactory();
OrderMainDAO mainDAO = df.createOrderMainDAO();
OrderDetailDAO detailDAO = df.createOrderDetailDAO();
mainDAO.saveOrderMain();
detailDAO.saveOrderDetail();
抽象工厂优点:
分离接口和实现;使得切换产品簇变得容易
缺点:
不太容易扩展新的产品;容易造成类层次复杂
public interface AbstractFactory{
public AbstractProductA createProductA();
public AbstractProductB createProductB();
}
public interface AbstractProductA {
}
public interface AbstractProductB {
}
public class ProductA1 implements AbstractProductA {
}
public class ProductA2 implements AbstractProductA {
}
public class ProductB1 implements AbstractProductB {
}
public class ProductB2 implements AbstractProductB {
}
public class ConcreteFactory1 implements AbstractFactory {
public AbstractProductA createProductA() {
return new ProductA1();
}
public AbstractProductB createProductB() {
return new ProductB1();
}
}
public class ConcreteFactory2 implements AbstractFactory {
public AbstractProductA createProductA() {
return new ProductA2();
}
public AbstractProductB createProductB() {
return new ProductB2();
}
}
客户端代码可以如下:
AbstractFactory af = new ConcreteFactory1();
af.createProductA();
af.createProductB();
AbstractFactory在java中通常实现成为接口,具体的实现是在实现类中。
AbstractFactory定义的创建创建产品的方法可以看出是工厂方法,而这些工厂方法的实现就延迟到了具体的工厂里面。也就是说使用工厂方法来实现抽象工厂。
可以改造为使用参数的抽象工厂。
DAO模式实现的时候采用工厂方法和抽象工厂。
使用抽象工厂实现DAO模式
public abstract class DAOFactory{
public abstract OrderMainDAO createOrderMainDAO();
public abstract OrderDetailDAO createOrderDetailDAO();
}
public interface OrderMainDAO {
public void saveOrderMain();
}
public interface OrderDetailDAO {
public void saveOrderDetail();
}
public class RdbMainDAOImpl implements OrderMainDAO {
public void saveOrderMain() {
System.out.println("now in RdbMainDAOImpl");
}
}
public class RdbDetailDAOImpl implements OrderDetailDAO {
public void saveOrderDetail() {
System.out.println("now in RdbDetailDAOImpl");
}
}
public class XmlMainDAOImpl implements OrderMainDAO {
public void saveOrderMain() {
System.out.println("now in XmlMainDAOImpl");
}
}
public class XmlDetailDAOImpl implements OrderDetailDAO {
public void saveOrderDetail() {
System.out.println("now in XmlDetailDAOImpl");
}
}
public class RdbDAOFactory extends DAOFactory {
public OrderMainlDAO createOrderMainDAO() {
return new RdbMainDAOImpl();
}
public OrderDetailDAO createOrderDetailDAO() {
return new RdbDetailDAOImpl();
}
}
public class XmlDAOImpl extends DAOFactory {
public OrderMainDAO createOrderMainDAO() {
return new XmlMainDAOImpl();
}
public OrderDetailDAO createOrderDetailDAO() {
return new XmlDetailDAOImpl();
}
}
客户端可以用下面的代码:
DAOFactory df = new RdbDAOFactory();
OrderMainDAO mainDAO = df.createOrderMainDAO();
OrderDetailDAO detailDAO = df.createOrderDetailDAO();
mainDAO.saveOrderMain();
detailDAO.saveOrderDetail();
抽象工厂优点:
分离接口和实现;使得切换产品簇变得容易
缺点:
不太容易扩展新的产品;容易造成类层次复杂
发表评论
-
访问者模式Visitor预留通路,回调实现
2014-03-13 16:55 319表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各 ... -
桥接模式Bridge分离抽象和实现
2014-03-13 16:55 431将抽象部分与它的实现部分分离,使它们都可以独立地变化。 桥接 ... -
职责链模式Chain of Responsibility分离职责,动态组合
2014-03-12 17:25 309使多个对象都有机会处 ... -
装饰模式Decorator动态组合
2014-03-12 17:00 244动态地给一个对象添加 ... -
解释器模式Interpreters分离实现,解释执行
2014-03-12 16:27 259给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解 ... -
享元模式Flyweight分离与共享
2014-03-12 13:20 271运用共享技术有效地支持大量细粒度的对象。 安全实体:就是被系 ... -
备忘录模式Memento保存和回复内部状态
2014-03-11 17:47 404在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外 ... -
状态模式State根据状态来分离和选择行为
2014-03-11 17:20 355允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改 ... -
策略模式Strategy分离算法,选择实现
2014-03-11 15:26 387迪米特法则:LoD,最少知识原则。 如果两个类不必彼此直接通信 ... -
模板方法模式Templete Method 固定算法骨架
2014-03-11 11:15 509定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法 ... -
组合模式Composite统一叶子对象和组合对象
2014-03-07 18:18 286将对象组合成树型结构以表示“部分-整体”的层次结构。组合模式使 ... -
迭代器模式Iterator 控制访问聚合对象中的元素
2014-03-07 17:57 387提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该 ... -
命令模式Command 封装请求
2014-03-07 16:26 336将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数 ... -
观察者模式Observer订阅模式-触发联动
2014-03-07 11:19 342定义对象间的一种一对 ... -
代理模式Proxy 为别人做嫁衣(控制对象访问)
2014-03-06 00:39 302为其他对象提供一种代理以控罪对这个对象的访问。 代理大致被分为 ... -
中介者模式Mediator 封装交互
2014-03-06 00:19 346用一个中介对象来封装 ... -
原型模式Prototype 克隆生成对象
2014-03-06 00:19 542用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 ... -
生成器模式Builder 分离整体构建算法和部件构造
2014-03-06 00:19 278将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建 ... -
工厂方法模式Factory Method延迟到子类来选择实现
2014-03-05 18:12 891定义一个用于创建对象 ... -
单例模式Singleton某个类只需要一个类实例
2014-03-05 16:46 395保证一个类只有一个实例,并提供一个访问它的全局访问点。 懒汉 ...
相关推荐
博客 走进设计模式之抽象工厂(Abstract Factory) 对应代码
3、抽象工厂模式(Abstract Factory Pattern) 用意:一个工厂生产一系列产品
目中继承于抽象工厂,实现抽象工厂中的方法,取出具体产品,某一件上衣,某一条裤子。 抽象产品:虚拟的衣服,也只是个概念。在项目中可能是多个接口或抽象类,定义规则,有什么特性,起什么作用。 具体产品:具体...
设计模式抽象工厂模式(AbstractFactory)源代码
C#设计模式之抽象工厂(abstract factory)模式示例源代码
设计模式C++学习之抽象工厂模式(AbstractFactory)
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/1032977
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
java之 抽象工厂模式(abstract factory) 之水果类和蔬菜类 (香蕉、梨、黄瓜、大蒜),北方市场,南方市场。。
Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂
设计模式,AbstractFactory,抽象工厂模式
每个具体工厂生产出来的具体产品根据不同工厂的不同各不相同,但是客户使用产品的方法是一致的。比如客户在得到餐具和食物之后,两者的搭配是正确的(使用汤匙喝牛奶,使用刀子切面包)。 在本例子中有3个具体工厂...
设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),...这就是我们要说的抽象工厂模式。
利用Abstract Factory模式我们可以通过不同的工大生产出一整套的产品。如DELLFactory里,生产出来的鼠标、键盘、显示 器和主机产品都是DELL牌的(这样视乎就是DELL牌电脑了呢,哈哈!)。我不相信DELL的键盘,那就...
NULL 博文链接:https://conkeyn.iteye.com/blog/1245113
在前一节,我们介绍了Strategy模式,并使用此模式实现了一个根据角色的职业来分配技能的范例(实际也就是动态地为类分配方法)。...本文将讨论如何使用GOF的Abstract Factory抽象工厂来实现这样的角色外形设计。
NULL 博文链接:https://zhouhaitao.iteye.com/blog/1003684
抽象工厂模式可以实现不同数据库之间的无缝移植。 该项目是在三层架构的基础上改进的。希望对初学者有帮助。
里面是整个抽象工厂的实现,具体可以参见我的博客 http://blog.csdn.net/renlei0109/article/details/25242983