抽象工厂模式

抽象工厂模式是工厂模式的升级版本。适用多系列多产品的场景。

先看定义: Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

假如现在需要向之前工厂模式的例子中加入进口和国产的概念。那应该怎样改呢?

先看客户端代码
public static void main(String[] args) {
	// 进口车工厂
	AbstractCarFactory importedCarFactory = new ImportedCarFactory();
	
	// 国产车工厂
	AbstractCarFactory domesticCarFactory = new DomesticCarFactory();

	AbstractAudi importedAudi = importedCarFactory.createAudi();
	AbstractAudi domesticAudi = domesticCarFactory.createAudi();

	importedAudi.someAudiOnly();
	domesticAudi.someAudiOnly();
}


这里我们分别创建了进口车工厂和国产车工厂, 然后就可以让这两个工厂工作了。

运行结果:
引用
Imported Audi.
Domestic Audi.


再看看抽象工厂类
public abstract class AbstractCarFactory {

	public abstract AbstractAudi createAudi();

	public abstract AbstractBMW createBMW();

	public abstract AbstractBenz createBenz();
}


具体的工厂类
public class ImportedCarFactory extends AbstractCarFactory {

	@Override
	public AbstractAudi createAudi() {
		return new ImportedAudi();
	}

	@Override
	public AbstractBMW createBMW() {
		return new ImportedBMW();
	}

	@Override
	public AbstractBenz createBenz() {
		return new ImportedBenz();
	}
}

public class DomesticCarFactory extends AbstractCarFactory {

	@Override
	public AbstractAudi createAudi() {
		return new DomesticAudi();
	}

	@Override
	public AbstractBMW createBMW() {
		return new DomesticBMW();
	}

	@Override
	public AbstractBenz createBenz() {
		return new DomesticBenz();
	}
}


抽象汽车类
public abstract class AbstractAudi implements Car {

	public abstract void someAudiOnly();

	@Override
	public void showCurrentSpeed() {
		System.out.println("180");
	}

	@Override
	public void showDes() {
		System.out.println("I'm Audi");
	}

	@Override
	public void start() {
		System.out.println("Audi started...");
	}

	@Override
	public void stop() {
		System.out.println("Audi stoped...");
	}
}


具体的汽车类
public class ImportedAudi extends AbstractAudi {

	@Override
	public void someAudiOnly() {
		System.out.println("Imported Audi.");
	}
}

public class DomesticAudi extends AbstractAudi {

	@Override
	public void someAudiOnly() {
		System.out.println("Domestic Audi.");
	}
}


补充一点: 抽象工厂模式也 不符合开闭原则

你可能感兴趣的:(java,工作)