设计模式学习-工厂模式

本文详细介绍了设计模式中的工厂模式,包括定义、工作原理以及如何封装对象的创建。通过个人和他人的总结,阐述了工厂模式的优点,如高扩展性和屏蔽产品实现细节,同时指出其潜在的复杂度问题。并给出了具体实例,如抽象工厂和具体产品对象(EggPizza、FriutPizza)的创建过程,以帮助读者更好地理解和应用工厂模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工厂模式

定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类。

说明:

  • 所有的工厂模式都是用来封装对象的创建。工厂模式通过让子来决定应该创建的对象是什么,以达到将对象创建的过程封装的目的。
  • 编写创建者时,不需要知道实际创建的产品是哪一个,选择了使用哪个子类,而是由子类去实例化。

个人总结

  • 其实可以简单这样理解:工厂的核心就是创建对象的一个方法。
  • 通过工厂返回的对象,调用对象的方法。
  • 在工厂子类中去创建实例对象,即在子类中写义务逻辑
  • 考虑到多态,将产品写成抽象方法,让子类去实现他,工厂创建的也是具体的子类。
  • 对主函数而言,不需要指定实例化创建的产品是谁,而是通过调用工厂的创建子类方法。
    这里写图片描述

其他总结

优点
  • 一个调用者想创建一个对象,只要知道其名称就可以了。
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  • 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
  • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事

具体实例

抽象工厂:

  public abstract class PizzaStore {
//抽象方法:得到一个具体的Produce对象
public abstract Pizza getPizza(String type);

//提供一个购买pizza的方法
public void orderPizza(String type) {
    Pizza pizza = getPizza(type);
    pizza.prepare();//准备pizza
    pizza.bake();//烤pizza
    pizza.cut();//切pizza
    pizza.box();//打包
}
}

具体工厂:

public class PizzaStoreA extends PizzaStore{
//实现父类抽象方法,返回具体实例
@Override
public Pizza getPizza(String type) {
    // TODO Auto-generated method stub
    if (type.equals("egg")) {
        return new EggPizza();
    }else {
        return new FriutPizza();
    }
}
}

父类对象

public abstract class Pizza {
String name;
String sauce; //佐料
ArrayList<String> list = new ArrayList<String>();

public void prepare(){
    System.out.println("name  "+name);
    System.out.println("sauce  "+sauce);
    for(int i=0;i<list.size();i++){
        System.out.println(list.get(i)+" in pizza");    
    }
}
public void bake(){
    System.out.println("baking");   
}
public void cut(){
    System.out.println("pizza is cuting");  
}

public void box(){
    System.out.println("pizza in box"); 
}

具体实例对象:EggPizza

public class EggPizza extends Pizza{
public EggPizza() {
    // TODO Auto-generated constructor stub
    name = "EggPizza";
    sauce = "Egg";
    list.add("Egg");
}   
//可以重新父类方法
}

具体实例对象:FriutPizza

public class FriutPizza extends Pizza{

public FriutPizza() {
    // TODO Auto-generated constructor stub
    name = "FriutPizza";
    sauce = "Friut";
    list.add("Friut");
}
}

测试类:

public class MainTest {
public static void main(String[] args) {
    PizzaStore pizzaStore = new PizzaStoreA();
    pizzaStore.orderPizza("egg");
    pizzaStore.orderPizza("other");
}
}

运行结果

name: EggPizza
sauce: Egg
Egg in pizza
baking
pizza is cuting
pizza in box

name: FriutPizza
sauce: Friut
Friut in pizza
baking
pizza is cuting
pizza in box
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值