创建型模式()——

    抽象工厂模式(百度百科)

  编辑
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
定义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类

简介

编辑
当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品 [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();
}
result
The 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。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值