赞
踩
工厂模式的定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。这满足创建型模式中所要求的“创建与使用相分离”的特点。
按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。
在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。
简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”。
“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
优点:
缺点:
应用场景
对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。
简单工厂模式的主要角色如下:
其结构图如下图所示。
抽象产品
public interface Car {
void name();
}
具体产品
public class Lamborghini implements Car{
@Override
public void name() {
System.out.println("兰博基尼");
}
}
public class Porsche implements Car{
@Override
public void name() {
System.out.println("保时捷");
}
}
简单工厂
//工厂类
public class CarFactory {
//创建产品的方法
public static Car getCar(String car){
if ("保时捷".equals(car)){
return new Porsche();
}else if ("兰博基尼".equals(car)){
return new Lamborghini();
}else {
return null;
}
}
测试类测试:
public class Consumer {
public static void main(String[] args) {
//直接调用工厂类创建产品的方法,不需要知道具体的细节,只需要知道产品名就行
Car car = CarFactory.getCar("兰博基尼");
Car car1 = CarFactory.getCar("保时捷");
car.name();//兰博基尼
car1.name();//保时捷
}
}
“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
优点:
缺点:
应用场景:
工厂方法模式的主要角色如下。
结构图如下图所示:
抽象产品
public interface Car {
void name();
}
具体产品
public class Lamborghini implements Car{
@Override
public void name() {
System.out.println("兰博基尼");
}
}
public class Porsche implements Car{
@Override
public void name() {
System.out.println("保时捷");
}
}
抽象工厂
//抽象工厂
public interface CarFactory {
Car getCar();
}
具体工厂,它同具体产品之间一一对应
//具体工厂
public class LamborghiniFactory implements CarFactory{
@Override
public Car getCar() {
return new Lamborghini();
}
}
//具体工厂
public class PorscheFactory implements CarFactory{
@Override
public Car getCar() {
return new Porsche();
}
}
测试类测试:
public class Consumer {
public static void main(String[] args) {
//调用具体工厂,由具体工厂实现
Car car = new LamborghiniFactory().getCar();
Car car1 = new PorscheFactory().getCar();
car.name();//兰博基尼
car1.name();//保时捷
}
}
抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到**同族的不同等级的产品**的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
使用抽象工厂模式一般要满足以下条件。
优缺点:
抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。
其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。
产品等级与产品族:
抽象工厂模式的应用场景:
抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。
抽象工厂模式的主要角色如下。
抽象工厂模式的结构图:
抽象产品,定义了产品的规范,描述了产品的主要特性和功能
//手机产品接口
public interface IPhoneProduct {
void start();
void shutdown();
void callup();
void sendSMS();
}
//路由器产品接口
public interface IRouterProduct {
void start();
void shutdown();
void openWifi();
void setting();
}
抽象工厂,提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
//抽象工厂
public interface IProductFactory {
//手机是一个产品等级,路由器又是一个产品等级
//生产手机
IPhoneProduct iPhoneProduct();
//生产路由器
IRouterProduct iRouteProduct();
}
具体工厂,实现抽象工厂中的多个抽象方法,完成具体产品的创建。
//小米工厂,这是一个产品族
public class RedmiProduct implements IProductFactory{
//下面是两个不同的产品等级
@Override
public IPhoneProduct iPhoneProduct() {
return new RedmiPhone();
}
@Override
public IRouterProduct iRouteProduct() {
return new RedmiRouter();
}
}
//华为工厂,这又是一个产品族
public class HuaweiProduct implements IProductFactory{
//下面是两个不同的产品等级
@Override
public IPhoneProduct iPhoneProduct() {
return new HuaweiPhone();
}
@Override
public IRouterProduct iRouteProduct() {
return new HuaweiRouter();
}
}
具体产品,实现了抽象产品所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
package com.cheng.factory.abstractFactory; public class RedmiPhone implements IPhoneProduct{ @Override public void start() { System.out.println("小米开机"); } @Override public void shutdown() { System.out.println("小米关机"); } @Override public void callup() { System.out.println("小米打电话"); } @Override public void sendSMS() { System.out.println("小米发短信"); } }
package com.cheng.factory.abstractFactory; public class RedmiRouter implements IRouterProduct{ @Override public void start() { System.out.println("小米路由器开机"); } @Override public void shutdown() { System.out.println("小米路由器关机"); } @Override public void openWifi() { System.out.println("小米路由器开wifi"); } @Override public void setting() { System.out.println("小米路由器设置"); } }
package com.cheng.factory.abstractFactory; public class HuaweiPhone implements IPhoneProduct{ @Override public void start() { System.out.println("华为开机"); } @Override public void shutdown() { System.out.println("华为关机"); } @Override public void callup() { System.out.println("华为打电话"); } @Override public void sendSMS() { System.out.println("华为发短信"); } }
package com.cheng.factory.abstractFactory; public class HuaweiRouter implements IRouterProduct{ @Override public void start() { System.out.println("华为路由器开机"); } @Override public void shutdown() { System.out.println("华为路由器关机"); } @Override public void openWifi() { System.out.println("华为路由器开wifi"); } @Override public void setting() { System.out.println("华为路由器设置"); } }
最后测试类,进行测试:
public class Consumer { public static void main(String[] args) { System.out.println("===========小米产品系列==========="); RedmiProduct redmiProduct = new RedmiProduct(); //生产小米手机 IPhoneProduct iPhoneProduct = redmiProduct.iPhoneProduct(); //生产小米路由器 IRouterProduct iRouterProduct = redmiProduct.iRouteProduct(); iPhoneProduct.start();//小米开机 iRouterProduct.start();//小米路由器开机 System.out.println("===========华为产品系列==========="); HuaweiProduct huaweiProduct = new HuaweiProduct(); //生产华为手机 IPhoneProduct iPhoneProduct1 = huaweiProduct.iPhoneProduct(); //生产华为路由器 IRouterProduct iRouterProduct1 = huaweiProduct.iRouteProduct(); iPhoneProduct1.start();//华为开机 iRouterProduct1.start();//华为路由器开机 } }
抽象工厂模式模式的扩展:
抽象工厂模式的扩展有一定的“开闭原则”倾斜性:
另一方面,当系统中只存在一个等级结构的产品时,抽象工厂模式将退化到工厂方法模式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。