-
抽象工厂模式(百度百科)
编辑
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
定义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类
当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品
[1]
角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
每一个模式都是针对一定问题的解决方案,
工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
适用性
1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。
参与者
1.AbstractFactory 声明一个创建抽象产品对象的操作接口。 2.ConcreteFactory 实现创建具体产品对象的操作。 3.AbstractProduct 为一类产品对象声明一个接口。 4.ConcreteProduct 定义一个将被相应的具体工厂创建的产品对象。 实现AbstractProduct接口。 5.Client 仅使用由AbstractFactory和AbstractProduct类声明的接口例子
AbstractFactory (抽象产品对象的接口)public interface IAnimalFactory { ICat createCat();//猫,接口方法 IDog createDog();//狗,接口方法 }
ConcreteFactory (实现抽象产品对象接口的类,实现其中方法)//实现黑颜色动物的类,
public class BlackAnimalFactory implements IAnimalFactory { public ICat createCat() { return new BlackCat(); } public IDog createDog() { return new BlackDog(); } }
//实现白颜色动物的类
public class WhiteAnimalFactory implements IAnimalFactory { public ICat createCat() { return new WhiteCat(); } public IDog createDog() { return new WhiteDog(); } }一般而言,有多少个产品等级结构,就会在工厂角色中发现多少个工厂方法。每一个产品等级结构中有多少个具体的产品,就有多少个产品族,也就会在工厂等级结构中发现多少个具体工厂。
AbstractProduct (为一类产品对象声明一个接口)public interface ICat { void eat(); }public interface IDog { void eat(); }ConcreteProduct ( 定义一个将被相应的具体工厂创建的产品对象。 实现AbstractProduct接口 。 )//具体的黑猫所拥有的方法类public class BlackCat implements ICat { public void eat() { System.out.println("The black cat is eating!"); } }//具体的白猫所拥有的的方法类public class WhiteCat implements ICat { public void eat() { System.out.println("The white cat is eating!"); } }//具体的黑狗所拥有的方法类public class BlackDog implements IDog { public void eat() { System.out.println("The black dog is eating"); } }//具体的白狗所拥有的方法类public class WhiteDog implements IDog { public void eat() { System.out.println("The white dog is eating!"); } }Client使用由AbstractFactory和AbstractProduct类声明的接口
public static void main(String[] args) { IAnimalFactory blackAnimalFactory = new BlackAnimalFactory(); ICat blackCat = blackAnimalFactory.createCat(); blackCat.eat(); IDog blackDog = blackAnimalFactory.createDog(); blackDog.eat(); IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory(); ICat whiteCat = whiteAnimalFactory.createCat(); whiteCat.eat(); IDog whiteDog = whiteAnimalFactory.createDog(); whiteDog.eat(); }resultThe black cat is eating! The black dog is eating! The white cat is eating! The white dog is eating!
优点:1.它分离了具体的类2.它使得易于交换产品系列3.它有利于产品的一致性缺点:难以支持新种类的产品微型计算机配件,这个系统所需要的产品族有两个,一个系列是PC系列,另一个系列是MAC系列。产品等级结构也有两个,一个是RAM,一个是CPU。