工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
1.简单工厂模式(静态工厂模式)
Car接口
public interface Car {
void name();
}
Dazhong实现类
public class Dazhong implements Car{
@Override
public void name() {
System.out.println("一汽大众!");
}
}
Wuling实现类
public class Wuling implements Car{
@Override
public void name() {
System.out.println("五菱宏光!");
}
}
CarFactory工厂类
public class CarFactory {
public static Car getCar(String name) {
if (name.equals("大众")) {
return new Dazhong();
}else if (name.equals("五菱")) {
return new Wuling();
}else {
return null;
}
}
}
测试类
public class Test11 {
public static void main(String[] args) {
Car car = CarFactory.getCar("大众");
Car car1 = CarFactory.getCar("五菱");
car.name();
car1.name();
}
}
2.工厂方法模式
Car接口
public interface Car {
void name();
}
Dazhong实现类
public class Dazhong implements Car{
@Override
public void name() {
System.out.println("一汽大众!");
}
}
CarFactory接口
public interface CarFactory {
Car getCar();
}
DazhongFactory实现类
public class DazhongFactory implements CarFactory{
@Override
public Car getCar() {
return new Dazhong();
}
}
测试类
public class Test22 {
public static void main(String[] args) {
CarFactory carFactory=new DazhongFactory();
carFactory.getCar().name();
}
}
3.抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
IPhoneProduct接口
//手机产品
public interface IPhoneProduct {
//功能
void open();
void close();
void phone();
}
IRouterProduct接口
//路由器产品
public interface IRouterProduct {
//功能
void open();
void close();
void setting();
}
XiaomiPhone实现类
public class XiaomiPhone implements IPhoneProduct{
@Override
public void open() {
System.out.println("打开小米手机");
}
@Override
public void close() {
System.out.println("关闭小米手机");
}
@Override
public void phone() {
System.out.println("用小米手机打电话");
}
}
XiaomiRouter实现类
public class XiaomiRouter implements IRouterProduct{
@Override
public void open() {
System.out.println("打开小米路由器");
}
@Override
public void close() {
System.out.println("关闭小米路由器");
}
@Override
public void setting() {
System.out.println("设置小米路由器");
}
}
HuaweiPhone实现类
public class HuaweiPhone implements IPhoneProduct{
@Override
public void open() {
System.out.println("打开华为手机");
}
@Override
public void close() {
System.out.println("关闭华为手机");
}
@Override
public void phone() {
System.out.println("用华为手机打电话");
}
}
HuaweiRouter实现类
public class HuaweiRouter implements IRouterProduct{
@Override
public void open() {
System.out.println("打开华为路由器");
}
@Override
public void close() {
System.out.println("关闭华为路由器");
}
@Override
public void setting() {
System.out.println("设置华为路由器");
}
}
IProductFactory接口(抽象工厂的接口)
//抽象的抽象,只关注产品族
public interface IProductFactory {
//生产手机
IPhoneProduct producePhone();
//生产路由器
IRouterProduct produceRouter();
}
XiaomiProductFactory实现类
//生产小米的工厂
public class XiaomiProductFactory implements IProductFactory{
//小米手机
@Override
public IPhoneProduct producePhone() {
return new XiaomiPhone();
}
//小米路由器
@Override
public IRouterProduct produceRouter() {
return new XiaomiRouter();
}
}
HuaweiProductFactory实现类
//生产华为的工厂
public class HuaweiProductFactory implements IProductFactory{
//华为手机
@Override
public IPhoneProduct producePhone() {
return new HuaweiPhone();
}
//华为路由器
@Override
public IRouterProduct produceRouter() {
return new HuaweiRouter();
}
}
测试
public class Test33 {
public static void main(String[] args) {
XiaomiProductFactory xiaomiProductFactory = new XiaomiProductFactory();
xiaomiProductFactory.producePhone().phone();
xiaomiProductFactory.producePhone().open();
xiaomiProductFactory.produceRouter().close();
xiaomiProductFactory.produceRouter().setting();
}
}
总结:
抽象工厂接口只关注产品族(手机,路由器),产品功能由另外的接口负责。