目录
工厂模式核心思想:
1. 实例化对象不使用new,用工厂方法代替。
2. 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
分类:
1. 简单工厂模式
2. 工厂方法模式
3. 抽象工厂模式
一、简单工厂模式
用来生产统一等级结构中的任意产品。
举例:
创建一个接口Car,并且提供一个抽象方法getName()。
public interface Car {
void getName();
}
现在分别创建两个接口实现类:
public class Benz implements Car{
@Override
public void getName() {
System.out.println("奔驰");
}
}
public class BMW implements Car {
@Override
public void getName() {
System.out.println("宝马");
}
}
创建一个车工厂,用于生成基于给定实体类的对象
public class CarFactory {
public static Car getCar(String car){
if (car.equals("宝马")){
return new BMW();
}else if (car.equals("奔驰")){
return new Benz();
}else
return null;
}
}
现在创建一个Customer去买车
public class Customer {
public static void main(String[] args) {
Car car = CarFactory.getCar("宝马");
car.getName();
Car car1 = CarFactory.getCar("奔驰");
car1.getName();
}
}
输出:
二、工厂方法模式
用来生产统一等级结构中的固定产品。
实现
依旧去买车
先创建车接口以及工厂接口,其中工厂接口提供方法。
public interface Car {
void getName();
}
public interface FactoryMethod {
Car getCar();
}
再分别创建每个接口的实现类
public class BMW implements Car{
@Override
public void getName() {
System.out.println("宝马!");
}
}
public class BMWFactory implements FactoryMethod{
@Override
public Car getCar() {
return new BMW();
}
}
我们再去买车!
public class Customer {
public static void main(String[] args) {
BMWFactory bmwFactory = new BMWFactory();
Car car = bmwFactory.getCar();
car.getName();
}
}
打印:
三、抽象工厂模式
3.1 定义
是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
使用抽象工厂模式一般要满足以下条件。
-
可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
-
当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
-
抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。
其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。
3.2 结构与实现
3.2.1 结构
3.2.2 实现
创建两个接口,分别对应手机和路由器
public interface PhoneFactory {
void openPhone();
void closePhone();
void call();
void sendSMS();
}
public interface RouterFactory {
void openRouter();
void closeRouter();
void openWifi();
void setting();
}
再分别创建对应的实现类:
public class XiaomiPhone implements PhoneFactory{
@Override
public void openPhone() {
System.out.println("开启小米手机");
}
@Override
public void closePhone() {
System.out.println("关闭小米手机");
}
@Override
public void call() {
System.out.println("小米手机打电话!");
}
@Override
public void sendSMS() {
System.out.println("小米手机发短信");
}
}
public class XiaomiRouter implements RouterFactory {
@Override
public void openRouter() {
System.out.println("开启小米路由器");
}
@Override
public void closeRouter() {
System.out.println("关闭小米路由器");
}
@Override
public void openWifi() {
System.out.println("开启小米路由器wifi");
}
@Override
public void setting() {
System.out.println("打开小米路由器设置");
}
}
再创建抽象工厂接口
public interface ProductFactory {
//生产手机
PhoneFactory phoneproduct();
//生产路由器
RouterFactory routerproduct();
}
再创建接口实现类
public class XiaomiFactory implements ProductFactory{
@Override
public PhoneFactory phoneproduct() {
return new XiaomiPhone();
}
@Override
public RouterFactory routerproduct() {
return new XiaomiRouter();
}
}
测试:
public class Test {
public static void main(String[] args) {
XiaomiFactory xiaomiFactory = new XiaomiFactory();
PhoneFactory phoneproduct = xiaomiFactory.phoneproduct();
phoneproduct.openPhone();
}
}
打印输出:
这里如果想要创建其他的厂商工厂,可以依照以上代码模仿创建测试。