5、工厂模式
工厂就是创建产品,该模式就是将创建对象的任务交给工厂。
1、简单工厂模式
也称为静态工厂模式,不属于32种经典设计模式,违背“开闭原则”,举例如下:
上面是UML类图,其中是类的一些关系。代码如下:
public interface Car {
void printName();
}
public class BMW implements Car {
@Override
public void printName() {
System.out.println("BMW车来了" );
}
}
public class Wuling implements Car{
@Override
public void printName() {
System.out.println("五菱车来了");
}
}
public class CarFactory {
public static Car getCar(String car){
if(car.equals("Wuling")){
return new Wuling();
}else if(car.equals("BMW")){
return new BMW();
}else{
return null;
}
}
//或者是这种
public static Car getBMW(){
return new BMW();
}
public static Car getWuLing(){
return new Wuling();
}
}
public class Customer {
public static void main(String[] args) {
Car car1 = CarFactory.getCar("Wuling");
Car car2 = CarFactory.getCar("BMW");
car1.printName();
car2.printName();
}
}
2、工厂方法模式
就是在不修改类的前提下,通过增加新的工厂类实现扩展。(开闭原则)
代码如下:
public interface Car {
void name();
}
public class BMW implements Car {
@Override
public void name() {
System.out.println("BMW车来了" );
}
}
public class Wuling implements Car {
@Override
public void name() {
System.out.println("五菱车来了");
}
}
public class Mobile implements Car {
@Override
public void name() {
System.out.println("摩拜车来了");
}
}
public interface CarFactory {
Car getCar();
}
public class BMWFactory implements CarFactory {
public Car getCar() {
return new BMW();
}
}
public class MobileFactory implements CarFactory {
@Override
public Car getCar() {
return new Mobile();
}
}
public class WuLingFactory implements CarFactory {
@Override
public Car getCar() {
return new Wuling();
}
}
public class Customer {
public static void main(String[] args) {
Car car1 = new WuLingFactory().getCar();
Car car2 = new BMWFactory().getCar();
car1.name();
car2.name();
Car car3 = new MobileFactory().getCar();
car3.name();
}
}
3、抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这个抽象工厂会被实现到多个实际工厂,每个实际工厂负责创建多个实际产品。(就是其他工厂实现这个抽象工厂接口。)
适用场景:
适合 一系列产品 同一产品族一起使用创建的场景。(比如抽象工厂定义制作手机接口和制作路由接口,那么苹果工厂就实现抽象工厂,就能制作手机和路由,那么苹果工厂制作手机和路由是苹果工厂的产品族。小米工厂制作的就是小米工厂的产品族。)
优点:
将一个系列的产品统一到一起进行创建。
缺点:
在规定了所有可能被创建的产品集合,想在产品集合中添加新的产品较困难,需要修改接口中的内容,违反了开闭原则。
示例如下:
public interface IRouterProduct {
void printName();
}
public interface IPhoneProduct {
void printName();
}
public class HuaweiPhone implements IPhoneProduct{
@Override
public void printName() {
System.out.println("华为手机");
}
}
public class HuaweiRouter implements IRouterProduct {
@Override
public void printName() {
System.out.println("华为路由");
}
}
public class XiaomiPhone implements IPhoneProduct{
@Override
public void printName() {
System.out.println("小米手机");
}
}
public class XiaomiPhone implements IPhoneProduct{
@Override
public void printName() {
System.out.println("小米手机");
}
}
//抽象工厂
public interface AbstarctFactory {
IRouterProduct getRouter();
IPhoneProduct getPhone();
}
public class HuaweiFactory implements AbstarctFactory {
@Override
public IRouterProduct getRouter() {
return new HuaweiRouter();
}
@Override
public IPhoneProduct getPhone() {
return new HuaweiPhone();
}
}
public class XiaomiFactory implements AbstarctFactory{
@Override
public IRouterProduct getRouter() {
return new XiaomiRouter();
}
@Override
public IPhoneProduct getPhone() {
return new XiaomiPhone();
}
}
//测试类
public class TsetAbstratcFactory {
public static void main(String[] args) {
//小米工厂
AbstarctFactory xiaomiFactory = new XiaomiFactory();
IPhoneProduct xiaomiPhone = xiaomiFactory.getPhone();
IRouterProduct xiaomiRouter = xiaomiFactory.getRouter();
xiaomiPhone.printName(); //小米手机
xiaomiRouter.printName(); //小米路由
//华为工厂
AbstarctFactory huaweiFactory = new HuaweiFactory();
IPhoneProduct huaweiPhone = huaweiFactory.getPhone();
IRouterProduct huaweiRouter = huaweiFactory.getRouter();
huaweiPhone.printName(); //华为手机
huaweiRouter.printName(); //华为路由
}
}