简单工厂用于生产同一类产品,即生产实现了同一个接口的类的对象(或者实现了同一个抽象类的类的对象),而抽象工厂用于生产一批产品。
对于抽象工厂,举个例子:厨房中有碗、灶台、和油烟机,抽象工厂可以根据需要同时生产所需规格的这三个对象,例如如果我们需要一个简单的厨房就可以让工厂生产“塑料碗”、“土灶台”、“烟囱”的农村简单厨房,如果我们需要的是城市使用的高端厨房就可以让工厂生产“陶瓷碗”、“燃气灶”、“电抽油烟机”。
对于简单工厂,可以根据需要生产“塑料碗”、“陶瓷碗”、“铁碗”,但是无法无法一下子生产碗、灶台、烟囱。
实现抽象工厂需要实现以下几点:
- 一个抽象的工厂类,该工厂类有多个抽象的方法,每个抽象方法用于生产不同的产品。
- 继承了抽象工厂类的具体抽象类,该类用于产生需要的一系列产品。
- 多个接口,所有需要被生产的类都实现该接口,例如碗一个接口,灶台一个接口,油烟机一个接口。
- 需要被生产的类。
抽象工厂类:
package pattern;
/*抽象厨房工厂*/
public abstract class AbstractkitchenFactory {
public abstract Bowl createBowl();
public abstract CookerHood crateCookerHook();
public abstract Hearth createHearth();
}
高端厨房工厂类:
package pattern;
/*
* 高端厨房工厂
* */
public class HighKitchenFactory extends AbstractkitchenFactory {
@Override
public Bowl createBowl() {
return new CeramicBowl();
}
@Override
public CookerHood crateCookerHook() {
return new LampblackMachine();
}
@Override
public Hearth createHearth() {
return new GasHearth();
}
}
低端厨房工厂类:
package pattern;
/*
* 低端厨房工厂
* */
public class LowerKitchenFactory extends AbstractkitchenFactory {
@Override
public Bowl createBowl() {
return new PlasticBowl();
}
@Override
public CookerHood crateCookerHook() {
return new Chimney();
}
@Override
public Hearth createHearth() {
return new SoilHearth();
}
}
碗抽象类:
package pattern;
/*
* 碗抽象类
* */
public abstract class Bowl {
public abstract void describe();
}
油烟机抽象类:
package pattern;
/*
*油烟机抽象类
* */
public abstract class CookerHood {
public abstract void describe();
}
灶台抽象类:
package pattern;
/*
* 灶台
* */
public abstract class Hearth {
public abstract void describe();
}
塑料碗:
package pattern;
/*
* 塑料工厂
* */
public class PlasticBowl extends Bowl {
@Override
public void describe() {
System.out.println("我是塑料碗");
}
}
陶瓷碗:
package pattern;
/*
* 陶瓷碗
* */
public class CeramicBowl extends Bowl {
@Override
public void describe() {
System.out.println("我是陶瓷碗");
}
}
土烟囱:
package pattern;
/*
* 烟囱
* */
public class Chimney extends CookerHood {
@Override
public void describe() {
System.out.println("我是土烟囱。。。。。");
}
}
抽油烟机:
package pattern;
/*
* 油烟机
* */
public class LampblackMachine extends CookerHood {
@Override
public void describe() {
System.out.println("我是油烟机");
}
}
土灶台:
package pattern;
/*
* 土灶台
* */
public class SoilHearth extends Hearth {
@Override
public void describe() {
System.out.println("我是土灶台");
}
}
燃气灶:
package pattern;
/*
*
* 天然气灶台*/
public class GasHearth extends Hearth {
@Override
public void describe() {
System.out.println("我是天然气灶台");
}
}
主类:
package pattern;
/**
* Created by Administrator on 2018/7/14.
*/
public class Main {
public static void main(String argc[]){
// AbstractkitchenFactory abstractkitchenFactory=new HighKitchenFactory();
AbstractkitchenFactory abstractkitchenFactory=new LowerKitchenFactory();
abstractkitchenFactory.createBowl().describe();
abstractkitchenFactory.createHearth().describe();
abstractkitchenFactory.crateCookerHook().describe();
}
}