java抽象工厂设计模式_java设计模式--抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

我们先回忆一下简单工厂模式的情形,有一个创建产品的接口,需要创建不同的产品时我们就需要创建多个工厂类。

//工厂接口

public interfaceIFactory {//创建产品

Product createProduct();

}//具体工厂

public class CarFactory implementsIFactory {

@OverridepublicProduct createProduct() {//创建产品实例对象

return newCar();

}

}public class BicycleFactory implementsIFactory {

@OverridepublicProduct createProduct() {return newBicycle();

}

}

public classCustomer {public static voidmain(String[] args) {

IFactory carFactory= newCarFactory();

Product car=carFactory.createProduct();

car.run();

IFactory bicycleFactory= newBicycleFactory();

Product bicycle=bicycleFactory.createProduct();

bicycle.run();

}

}

但是如果是这么一种情形呢,我们要生产的产品是一个类别,并且不再是一个,而是多个时,这种product接口就不符合情况了

我们看一个例子,假设需要不同的方法创建一系列产品

产品接口A以及实现。

public interfaceProductA {voidShow();

}public class ProductA1 implementsProductA {

@Overridepublic voidShow() {

System.out.println("使用工厂1生产出了产品A");

}

}public class ProductA2 implementsProductA {

@Overridepublic voidShow() {

System.out.println("使用工厂2生产出了产品A");

}

}

产品接口B以及实现。

public interfaceProductB {voidShow();

}public class ProductB1 implementsProductB {

@Overridepublic voidShow() {

System.out.println("使用工厂1生产出了产品B");

}

}public class ProductB2 implementsProductB {

@Overridepublic voidShow() {

System.out.println("使用工厂2生产出了产品B");

}

}

工厂接口以及实现,两个具体工厂分别对应两种生产该产品的方法。

public interfaceFactory {

ProductA ManufactureA();

ProductB ManufactureB();

}public class ConcreateFactory1 implementsFactory {

@OverridepublicProductA ManufactureA() {return newProductA1();

}

@OverridepublicProductB ManufactureB() {return newProductB1();

}

}public class ConcreateFactory2 implementsFactory {

@OverridepublicProductA ManufactureA() {return newProductA2();

}

@OverridepublicProductB ManufactureB() {return newProductB2();

}

}

在实际应用中,我们可能只需要某一种方法去创建产品A,B,但是当我们想要切换产品的生产方法时,就只需要将new ConcreateFactory1()替换为new ConcreateFactory2()就可以了,此时无论是哪一个工厂的方法,他生产某一个产品调用的都是同一个方法,例如factory.ManufactureA();但是如果在工厂方法模式中,我们新增一个产品的制作方法,就需要新增工厂,在客户端内去调用不同工厂的createProduct()这样就增加了系统的复杂性。

public classTest {public static voidmain(String[] args){

Factory factory= newConcreateFactory1();

ProductA productA=factory.ManufactureA();

ProductB productB=factory.ManufactureB();

productA.Show();

productB.Show();

Factory factory2= newConcreateFactory2();

ProductA productA2=factory2.ManufactureA();

ProductB productB2=factory2.ManufactureB();

productA2.Show();

productB2.Show();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值