具体的实现代码见附件
问题引人:组装电脑,要选择机箱、电源、主板、CPU等,为了简单,只考虑主板和cpu。
主板和cpu都有型号,而且如果要组装cpu的针脚数和主板提供的cpu插口要匹配才行。客户负责选择cpu和主板,然后将这些配件给装机工程师,工程师只负责组装,如何用程序实现这一个过程,尤其是选择配件,不使用抽象工厂模式,对于装机工程师来说,只知道cpu和主板的接口,而不知其具体实现,可以选择使用简单工厂模式和工厂方法模式,为了简单,选择简单工厂模式。客户告诉装机工程师自己的选择,装机工程师就会到工厂中取得相应的对象实例。
实例有何问题呢??cpu对象和主板对象时有关系的,需要匹配的。----》抽象工厂模式
工厂方法或简单工厂关注的是单个产品对象的创建,而抽象工厂要创建一系列的产品对象,而且这些对象是有联系的。
抽象工厂模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
会定义一个抽象工厂,在里面虚拟地创建客户端所需的一系列对象,所谓虚拟就是定义创建这些对象的抽象方法,不去真正实现,
然后由具体的抽象工厂的子类来提供这一系列对象的创建。抽象工厂为子类提供一个统一的外观,供客户端调用。
抽象工厂模式结构:
AbstractFactory:抽象工厂,定义创建一系列产品对象的操作接口
ConcreteFactory:具体的工厂,实现抽象工厂定义的方法,具体实现产品的创建
AbstractProduct:定义一类产品对象的接口
ConcreteProduct:具体的产品对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象。
Client:客户端,主要使用抽象工厂来获取一系列所需的产品对象,面向产品对象的接口编程,以实现需要的功能
如包abstractFactory中的实例定义
用抽象工厂模式解决问题,如chapter7中的abstractFactorySovle包
抽象工厂的功能是:为一系列相关的或有依赖关系的对象创建一个接口。这个接口里的方法不是任意定义的,而是相关的,有依赖的,如装配
cpu和主板,创建主板和创建cpu的方法的参数必须一致。
从某种意义上将,抽象工厂就是产品系列,如例子中代表的是电脑簇,每个不同的组装方案,代表不同的电脑系列。
抽象工厂通常实现为接口,不要被名称迷惑
如果要抽象工厂再创建一个内存对象,就必须在抽象工厂中增加一个方法,抽象工厂一变化,具体工厂就随着必须改变,如此就不够灵活
有一个相对灵活但不安全的方法,如extendedAbstractFactory包中的示例,添加新的产品对象,MemoryApi为其接口
抽象工厂模式和DAO
DAO:数据访问对象,是JavaEE的一个标准模式,通过它解决数据访问的一系列问题。也就是说,DAO需要抽象和封装所有对数据的访问,
实现DAO模式时候,最常见的实现策略就是使用工厂的策略,而且多采用抽象工厂模式来实现,factoryMethodDAO包中是利用
工厂方法模式实现的DAO策略,它要求DAO底层存储实现方式是固定的,对数据的操作是固定的,多用在一些简单的小项目上。
实际上更多时候DAO底层存储方式是不固定的,这是一般采用抽象工厂实现。如abstractFactoryDAO包中的示例
组装电脑示例使用抽象工厂实现dao,如包factoryMethodExampleDAO示例所示
抽象工厂模式的优点:
1,分离接口和实现,客户端使用抽象工厂来创建所需要的对象,而根本不知道具体的实现是谁。
2,使得切换产品簇变得容易,因为一个具体的工厂实现代表一个产品簇,比如schema1代表装机方案一,客户端选择不同的工厂实现,就相当于在切换不同的产品簇。
缺点:
1,不容易扩展到新产品,因为如果需要给整个产品簇添加产品,必须修改抽象工厂,这导致具体工厂实现也必须修改。
2,造成类层次复杂,
本质:选择产品簇的实现。
工厂方法是选择单个产品的实现,虽然一个类中可以有多个工厂方法,但他们之间都没有任何联系。但抽象工厂着重的是一个产品簇的选择实现,定义在
抽象工厂类的方法通常都是有联系的,如创建cpu和创建主板的方法。如果方法之间缺少联系就退化成了工厂方法,而工厂方法也可以退化成简单工厂。
问题引人:组装电脑,要选择机箱、电源、主板、CPU等,为了简单,只考虑主板和cpu。
主板和cpu都有型号,而且如果要组装cpu的针脚数和主板提供的cpu插口要匹配才行。客户负责选择cpu和主板,然后将这些配件给装机工程师,工程师只负责组装,如何用程序实现这一个过程,尤其是选择配件,不使用抽象工厂模式,对于装机工程师来说,只知道cpu和主板的接口,而不知其具体实现,可以选择使用简单工厂模式和工厂方法模式,为了简单,选择简单工厂模式。客户告诉装机工程师自己的选择,装机工程师就会到工厂中取得相应的对象实例。
实例有何问题呢??cpu对象和主板对象时有关系的,需要匹配的。----》抽象工厂模式
工厂方法或简单工厂关注的是单个产品对象的创建,而抽象工厂要创建一系列的产品对象,而且这些对象是有联系的。
抽象工厂模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
会定义一个抽象工厂,在里面虚拟地创建客户端所需的一系列对象,所谓虚拟就是定义创建这些对象的抽象方法,不去真正实现,
然后由具体的抽象工厂的子类来提供这一系列对象的创建。抽象工厂为子类提供一个统一的外观,供客户端调用。
抽象工厂模式结构:
AbstractFactory:抽象工厂,定义创建一系列产品对象的操作接口
ConcreteFactory:具体的工厂,实现抽象工厂定义的方法,具体实现产品的创建
AbstractProduct:定义一类产品对象的接口
ConcreteProduct:具体的产品对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象。
Client:客户端,主要使用抽象工厂来获取一系列所需的产品对象,面向产品对象的接口编程,以实现需要的功能
如包abstractFactory中的实例定义
package abstractFactory;
/*
* 抽象工厂,声明创建对象的操作,抽象工厂通常实现为接口,不要被名称迷惑
*/
public interface AbstractFactory {
public AbstractProductA createProductA(); //创建抽象产品A
public AbstractProductB createProductB();
}
package abstractFactory;
//抽象产品A的接口
public interface AbstractProductA {
}
package abstractFactory;
//抽象产品B的接口
public interface AbstractProductB {
}
package abstractFactory;
//具体 的工厂实现对象,实现创建具体的产品对象的操作
public class ConcreteFactory1 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}
package abstractFactory;
public class ConcreteFactory2 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
package abstractFactory;
//产品A的具体实现
public class ProductA1 implements AbstractProductA {
}
package abstractFactory;
//产品B的具体实现
public class ProductB1 implements AbstractProductB {
}
package abstractFactory;
public class Client {
public static void main(String[] args) {
// 创建抽象工厂对象
AbstractFactory af = new ConcreteFactory1();
// 通过抽象工厂,获取一系列的对象,如产品A和产品B
af.createProductA();
af.createProductB();
}
}
用抽象工厂模式解决问题,如chapter7中的abstractFactorySovle包
抽象工厂的功能是:为一系列相关的或有依赖关系的对象创建一个接口。这个接口里的方法不是任意定义的,而是相关的,有依赖的,如装配
cpu和主板,创建主板和创建cpu的方法的参数必须一致。
从某种意义上将,抽象工厂就是产品系列,如例子中代表的是电脑簇,每个不同的组装方案,代表不同的电脑系列。
抽象工厂通常实现为接口,不要被名称迷惑
如果要抽象工厂再创建一个内存对象,就必须在抽象工厂中增加一个方法,抽象工厂一变化,具体工厂就随着必须改变,如此就不够灵活
有一个相对灵活但不安全的方法,如extendedAbstractFactory包中的示例,添加新的产品对象,MemoryApi为其接口
抽象工厂模式和DAO
DAO:数据访问对象,是JavaEE的一个标准模式,通过它解决数据访问的一系列问题。也就是说,DAO需要抽象和封装所有对数据的访问,
实现DAO模式时候,最常见的实现策略就是使用工厂的策略,而且多采用抽象工厂模式来实现,factoryMethodDAO包中是利用
工厂方法模式实现的DAO策略,它要求DAO底层存储实现方式是固定的,对数据的操作是固定的,多用在一些简单的小项目上。
实际上更多时候DAO底层存储方式是不固定的,这是一般采用抽象工厂实现。如abstractFactoryDAO包中的示例
组装电脑示例使用抽象工厂实现dao,如包factoryMethodExampleDAO示例所示
抽象工厂模式的优点:
1,分离接口和实现,客户端使用抽象工厂来创建所需要的对象,而根本不知道具体的实现是谁。
2,使得切换产品簇变得容易,因为一个具体的工厂实现代表一个产品簇,比如schema1代表装机方案一,客户端选择不同的工厂实现,就相当于在切换不同的产品簇。
缺点:
1,不容易扩展到新产品,因为如果需要给整个产品簇添加产品,必须修改抽象工厂,这导致具体工厂实现也必须修改。
2,造成类层次复杂,
本质:选择产品簇的实现。
工厂方法是选择单个产品的实现,虽然一个类中可以有多个工厂方法,但他们之间都没有任何联系。但抽象工厂着重的是一个产品簇的选择实现,定义在
抽象工厂类的方法通常都是有联系的,如创建cpu和创建主板的方法。如果方法之间缺少联系就退化成了工厂方法,而工厂方法也可以退化成简单工厂。