简单工厂模式
1. 目的
工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一个类。
2 . 简单工厂模式的结构
3. 一个简单例子
java 代码
- //产品接口
- publicinterfaceProduct{
- publicvoidgetName();
- }
- //具体产品A
- publicclassProductAimplementsProduct{
- publicvoidgetName(){
- System.out.println("IamProductA");
- }
- }
- //具体产品B
- publicclassProductBimplementsProduct{
- publicvoidgetName(){
- System.out.println("IamProductB");
- }
- }
- //工厂类
- publicclassProductCreator{
- publicProductcreateProduct(Stringtype){
- if("A".equals(type)){
- returnnewProductA();
- }
- if("B".equals(type)){
- returnnewProductB();
- }else
- returnnull;
- }
- publicstaticvoidmain(String[]args){
- ProductCreatorcreator=newProductCreator();
- creator.createProduct("A").getName();
- creator.createProduct("B").getName();
- }
- }
• 在编码时不能预见需要创建哪一种类的实例。
• 一个类使用它的子类来创建对象。
• 开发人员不希望创建了哪个类的实例以及如何创建实例的信息暴露给外部程序。
抽象工厂模式
1. 抽象工厂模式可以说是简单工厂模式的扩展,它们主要的区别在于需要创建对象的复杂程度上。
在抽象工厂模式中,抽象产品可能是一个或多个,从而构成一个或多个产品族。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。
2. 抽象工厂模式的结构
3. 一个简单例子
java 代码
- //产品Plant接口
- publicinterfacePlant{
- }
- //具体产品PlantA,PlantB
- publicclassPlantAimplementsPlant{
- publicPlantA(){
- System.out.println("createPlantA!");
- }
- publicvoiddoSomething(){
- System.out.println("PlantAdosomething");
- }
- }
- publicclassPlantBimplementsPlant{
- publicPlantB(){
- System.out.println("createPlantB!");
- }
- publicvoiddoSomething(){
- System.out.println("PlantBdosomething");
- }
- }
- //产品Fruit接口
- publicinterfaceFruit{
- }
- //具体产品FruitA,FruitB
- publicclassFruitAimplementsFruit{
- publicFruitA(){
- System.out.println("createFruitA!");
- }
- publicvoiddoSomething(){
- System.out.println("FruitAdosomething");
- }
- }
- publicclassFruitBimplementsFruit{
- publicFruitB(){
- System.out.println("createFruitB!");
- }
- publicvoiddoSomething(){
- System.out.println("FruitBdosomething");
- }
- }
- //抽象工厂方法
- publicinterfaceAbstractFactory{
- publicPlantcreatePlant();
- publicFruitcreateFruit();
- }
- //具体工厂方法
- publicclassFactoryAimplementsAbstractFactory{
- publicPlantcreatePlant(){
- returnnewPlantA();
- }
- publicFruitcreateFruit(){
- returnnewFruitA();
- }
- }
- publicclassFactoryBimplementsAbstractFactory{
- publicPlantcreatePlant(){
- returnnewPlantB();
- }
- publicFruitcreateFruit(){
- returnnewFruitB();
- }
- }
在以下情况下,应当考虑使用抽象工厂模式。
首先,一个系统应当不依赖于产品类实例被创立,组成,和表示的细节。这对于所有形态的工厂模式都是重要的。
其次,这个系统的产品有多于一个的产品族。
第三,同属于同一个产品族的产品是设计成在一起使用的。这一约束必须得在系统的设计中体现出来。
最后,不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节。
其中第二丶第三个条件是我们选用抽象工厂模式而非其它形态的工厂模式的关键性条件。