工厂模式本质、作用 三种模式的简单示例

工厂模式
核心本质:
*实例化对象不使用new,用工厂方法代替
*将选择实现了,创建对象统一管理和控制,从而将调用者和为你们的实现类解耦
作用:
*实现了床建者和调用者分离
详细分类:
在这里插入图片描述

需要用到oop七大原则中的

在这里插入图片描述

1、简单工厂模式 -例子

在这里插入图片描述

Car接口–车 WuLing(五菱)和Tesla(特斯拉)继承Car
创建了一个车工厂Car Factory代码如下
在这里插入图片描述

在Consumer消费者中代码如下
在这里插入图片描述

简单工厂函数通过车工厂类去传递参数选择创建对象
缺点:如果我再添加一辆车就需要去工厂类里面去改代码,如此一来就违背了开闭原则—
所以需要工厂方法模式来解决这个问题

2、工厂方法模式 -例子

项目中如下
在这里插入图片描述

又给每个车的都创建了Factory,在每种车类的工厂里面去new实体的车,代码如下
在这里插入图片描述


CarFactory工厂为接口-代码如下
在这里插入图片描述

消费者去消费的时候就只需要选择new一个工厂的类,比如五菱的factory工厂,调用getCar();
在这里插入图片描述

总而言之就是实现了代码的解耦,

3、抽象工厂模式
在这里插入图片描述

类图如下
在这里插入图片描述

Client客户类用来测试
Factory为工厂
Huawei工厂
Huawei手机、路由器类
iphonePrduct为手机产品的接口
IproducFatory为抽象生产工厂,测试类只需要调用工厂
IRouterProduct为路由器产品接口小米工厂小米手机、路由器类

代码如下图
华为手机
package factory.abstractTest;

/**

  • 华为手机
    */
    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 factory.abstractTest;

public class HuaweiRouter implements IRouterProduct{
@Override
public void start() {
System.out.println(“启动华为路由器”);
}

@Override
public void shutdown() {
System.out.println(“关闭华为路由器”);
}

@Override
public void openWife() {
System.out.println(“打开华为wifi”);
}

@Override
public void settiong() {
System.out.println(“华为路由器设置”);
}
}

华为工厂
public class HuaweiFactory implements IProductFactory{
@Override
public IphoneProduct iphonePorduct() {
return new HuaweiPhone();
}
@Override
public IRouterProduct routerproduct() {
return new HuaweiRouter();
}
}

小米的和华为的一样编写应该路由器和手机类继承产品的接口

手机产品与路由器产品的接口
/**

  • 手机产品接口
    */
    public interface IphoneProduct {
    void start();
    void shutdown();
    void callup();
    void sendSMS();
    }

/**

  • 路由器接口
    */
    public interface IRouterProduct {
    void start();
    void shutdown();
    void openWife();
    void settiong();
    }

抽象产品的工厂
/**

  • 抽象产品工厂
    */
    public interface IProductFactory {
    //生产手机
    IphoneProduct iphonePorduct();
    //生产路由器
    IRouterProduct routerproduct();
    }

测试一下
public class Client {
public static void main(String[] args) {
System.out.println("=小米系列产品=============");
//小米工厂
XiaoMiFactory xiaoMiFactory=new XiaoMiFactory();
IphoneProduct iphoneProduct=xiaoMiFactory.iphonePorduct();
iphoneProduct.callup();
iphoneProduct.sendSMS();

IRouterProduct iRouterProduct=xiaoMiFactory.routerproduct();
iRouterProduct.openWife();

System.out.println("=华为系列产品=============");
//小米工厂
HuaweiFactory HuaweiFactory=new HuaweiFactory();
IphoneProduct iphoneProduct1 = HuaweiFactory.iphonePorduct();
iphoneProduct1.callup();
iphoneProduct1.sendSMS();

IRouterProduct iRouterProduct1=HuaweiFactory.routerproduct();
iRouterProduct1.openWife();
}
}
自我理解:
只需要去创建品牌的工厂,以品牌的工厂去调用抽象的产品工厂里的方法去选择生成手机还是路由器,而品牌的工厂里面去创建了类的实例返回方法是手机产品与路由器产品的接口,再去使用其方法,应该是做到了后续代码跟新添加品牌就再加一个品牌类以及要制造的产品类,要是要再制作一个产品比如电脑,那就再加入一个电脑的接口,再编写华为或者小米的电脑类去实现
就相当于添加了一个中间层–赋上类图如下

小结:
在这里插入图片描述
在B站上学习到的及时分析一下心得,老师说的小结抽象工厂不可以增加产品,但是增加产品也就是再增加一个接口就好了,可能是我没理解透彻,希望大佬们指导一下

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当我们需要创建对象时,使用工厂模式可以将对象的创建与使用分离,这样能够提高代码的可读性和可维护性。常见的工厂模式三种简单工厂模式、工厂方法模式和抽象工厂模式。下面是三种工厂模式的代码示例: 1. 简单工厂模式: ```python class Product: def operate(self): pass class ProductA(Product): def operate(self): print('ProductA operation') class ProductB(Product): def operate(self): print('ProductB operation') class SimpleFactory: def create_product(self, product_type): if product_type == 'A': return ProductA() elif product_type == 'B': return ProductB() else: raise ValueError(f'Invalid product type: {product_type}') # 使用简单工厂创建对象 factory = SimpleFactory() product_a = factory.create_product('A') product_b = factory.create_product('B') product_a.operate() # Output: "ProductA operation" product_b.operate() # Output: "ProductB operation" ``` 2. 工厂方法模式: ```python class Product: def operate(self): pass class ProductA(Product): def operate(self): print('ProductA operation') class ProductB(Product): def operate(self): print('ProductB operation') class Factory: def create_product(self): pass class FactoryA(Factory): def create_product(self): return ProductA() class FactoryB(Factory): def create_product(self): return ProductB() # 使用工厂方法创建对象 factory_a = FactoryA() product_a = factory_a.create_product() factory_b = FactoryB() product_b = factory_b.create_product() product_a.operate() # Output: "ProductA operation" product_b.operate() # Output: "ProductB operation" ``` 3. 抽象工厂模式: ```python class AbstractFactory: def create_product_a(self): pass def create_product_b(self): pass class ConcreteFactory1(AbstractFactory): def create_product_a(self): return ConcreteProductA1() def create_product_b(self): return ConcreteProductB1() class ConcreteFactory2(AbstractFactory): def create_product_a(self): return ConcreteProductA2() def create_product_b(self): return ConcreteProductB2() class AbstractProductA: def operate(self): pass class ConcreteProductA1(AbstractProductA): def operate(self): print('ConcreteProductA1 operation') class ConcreteProductA2(AbstractProductA): def operate(self): print('ConcreteProductA2 operation') class AbstractProductB: def operate(self): pass class ConcreteProductB1(AbstractProductB): def operate(self): print('ConcreteProductB1 operation') class ConcreteProductB2(AbstractProductB): def operate(self): print('ConcreteProductB2 operation') # 使用抽象工厂创建对象 factory1 = ConcreteFactory1() product_a1 = factory1.create_product_a() product_b1 = factory1.create_product_b() product_a1.operate() # Output: "ConcreteProductA1 operation" product_b1.operate() # Output: "ConcreteProductB1 operation" factory2 = ConcreteFactory2() product_a2 = factory2.create_product_a() product_b2 = factory2.create_product_b() product_a2.operate() # Output: "ConcreteProductA2 operation" product_b2.operate() # Output: "ConcreteProductB2 operation" ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值