Simple Factory模式
专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
Factory Method模式
将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数究竟应该创建何种对象由具体的子类负责决定。
Abstract Factory模式
提供一个共同的接口来创建相互关联的多个对象。
例:某个应用需要创建大量的Fish类,如Crucian等,而不只是Crap。抽象出的接口Fish里有方法swim()
Fish crap = new Crap();
Fish crucian = new Crucian();
如果要创建大量的Fish对象,这种方法就显得效率低下。采用简单工厂方法:
interface Fish
{
public void swim();
}
class Factory
{
public static Fish factory(String type){
if (type.equalsIgnoreCase("carp")){
return new Carp();
}
else if (type.equalsIgnoreCase("crucian")){
return new Crucian();
}
else{
return null;
}
}
}
class Carp implements Fish
{
public void swim(){
System.out.println("Carp can swim!");
}
}
class Crucian implements Fish
{
public void swim(){
System.out.println("Crucian can swim!");
}
}
public class Test
{
public static void main(String args[]){
Fish carp = Factory.factory("carp");
carp.swim();
}
}
在工厂方法中,核心工厂不再负责所有商品创建,它把具体的创建工作交给具体的子类去做。
interface Creator
{
public Fish factory();
}
interface Fish
{
public void swim();
}
class Carp implements Fish
{
public void swim(){
System.out.println("Carp can swim!");
}
}
class Crucian implements Fish
{
public void swim(){
System.out.println("Crucian can swim!");
}
}
class CarpCreator implements Creator
{
public Fish factory(){
return new Carp();
}
}
class CrucianCreator implements Creator
{
public Fish factory(){
return new Crucian();
}
}
public class Test
{
public static void main(String args[]){
CarpCreator carp = new CarpCreator();
carp.factory().swim();
}
}
3 - Abstract Factory模式:
抽象工厂又称工具箱(KIT),它提供一个创建相关或相互依赖对象的接口,无需指定具体类。
使用指南:
1. 一个系统要独立于它的产品的创建、组合和表示时
2. 一个系统要生产多个产品族,而系统只消费其中某一族的产品
3. 当设计者要强调一系列相关的产品对象的设计以便进行联合使用时
4. 当系统提供一个产品类库时,所有产品以同样的接口出现,从而使客户端不依赖于实现
如商品有鱼类和水果类等,同时鱼类可能有热带、温带之分,水果也如此。
interface Creator
{
public Fish createFish();
public Fruit createFruit();
}
interface Fish{}
interface Fruit{}
class TropicalFish implements Fish{}
class TropicalFruit implements Fruit{}
class TemperateFish implements Fish{}
class TemperateFruit implements Fruit{}
class TropicalFactory implements Creator
{
public Fish createFish(){
return new TropicalFish();
}
public Fruit createFruit(){
return new TropicalFruit();
}
}
class TemperateFactory implements Creator
{
public Fish createFish(){
return new TemperateFish();
}
public Fruit createFruit(){
return new TemperateFruit();
}
}
public class Test
{
public static void main(String args[]){
TropicalFactory crap = new TropicalFactory();
crap.createFish();
}
}