您的位置:首页 > 其它

(四)(创建型模式)抽象工厂模式

2016-11-22 20:55 190 查看
一、抽象工厂模式(Abstract factory pattern):

  [b]提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。[/b]

二、应用场景:

  建立一个工厂,根据工厂的子类决定实例化产品的组合,返回相应的产品组合。

三、应用实例:

  动物界的掌控者Tom,想要建立一个水果工厂,当客户指定具体的水果工厂组合时,该水果工厂就能生产对应的水果组合。(要求:具体的水果的组合易扩展)

四、方案:

  UML图:

  



代码:

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public interface Apple {
void produceApple();
}


产品接口-苹果

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public class RedApple implements Apple {
public void produceApple() {
System.out.println("红苹果");
}
}


具体产品-红苹果

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public class BlueApple implements Apple {
public void produceApple() {
System.out.println("蓝苹果");
}
}


具体产品-蓝苹果

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public interface Banana {
void produceBanana();
}


产品接口-香蕉

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public class RedBanana implements Banana {
public void produceBanana() {
System.out.println("红香蕉");
}
}


具体产品-红香蕉

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public class BlueBanana implements Banana {
public void produceBanana() {
System.out.println("蓝香蕉");
}
}


具体产品-蓝香蕉

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public interface Orange {
void produceOrange();
}


产品接口-橘子

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public class RedOrange implements Orange {
public void produceOrange(){
System.out.println("红橘子");
}
}


具体产品-红橘子

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public class BlueOrange implements Orange {
public void produceOrange() {
System.out.println("蓝橘子");
}
}


具体产品-蓝橘子

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public interface Factory {
Apple appleFactory();

Banana bananaFactory();

Orange orangeFactory();

}


工厂接口-水果工厂

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public class RedFactory implements Factory {

public Apple appleFactory() {
Apple apple = new RedApple();
return apple;
}

public Banana bananaFactory() {
Banana banana = new RedBanana();
return banana;
}

public Orange orangeFactory() {
Orange orange = new RedOrange();
return orange;
}
}


产品族-红色水果

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public class BlueFactory implements Factory {

public Apple appleFactory() {
Apple apple = new BlueApple();
return apple;
}

public Banana bananaFactory() {
Banana banana = new BlueBanana();
return banana;
}

public Orange orangeFactory() {
Orange orange = new BlueOrange();
return orange;
}
}


产品族-蓝色水果

package com.yq.test;

/**
* Created by yq on 2016/11/22.
*/
public class Clinet {
public static void main(String[] args) {
Apple redApple = new RedFactory().appleFactory();
Banana redBanana = new RedFactory().bananaFactory();
Orange redOrange = new RedFactory().orangeFactory();
redApple.produceApple();
redBanana.produceBanana();
redOrange.produceOrange();

Apple blueApple = new BlueFactory().appleFactory();
Banana blueBanana = new BlueFactory().bananaFactory();
Orange blueOrange = new BlueFactory().orangeFactory();
blueApple.produceApple();
blueBanana.produceBanana();
blueOrange.produceOrange();
}
}
//output
红苹果
红香蕉
红橘子
蓝苹果
蓝香蕉
蓝橘子


客户端调用-客户买红色水果,蓝色水果

备注:如果要扩展产品组合,只需新增一个具体的工厂类,组合生产对应的产品,原代码不需要做任何修改,满足开闭原则。

   如果要扩展已存在产品的具体产品,只需新增一个具体的产品类继承该产品,新增一个产品组合工厂即可, 原代码不需要做任何修改,满足开闭原则。

   如果要扩展一个新的产品类型,则需要新增新产品接口,和新产品的具体产品类,并改变工厂接口的代码,需要更改原代码。

以上内容,纯属个人见解,如有错误,望不吝指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: