设计模式——工厂模式

目录

1、简单工厂模式(又称静态工厂方法模式)

(1) 抽象产品(手机)

(2) 具体产品(小米、华为、OPPO)

(3) 工厂类1

(4) 工厂类2

2、工厂方法模式

(1) 抽象产品(手机)

(2) 具体产品(小米、华为、OPPO)

(3) 抽象工厂

(4) 具体工厂(小米、华为、OPPO)

3、抽象工厂模式

(1) 抽象产品(手机)

(2) 具体产品(小米、华为、OPPO)

(3) 抽象产品(电脑)

(4) 具体产品(dell、联想)

(5) 抽象工厂

(6) 具体工厂


1、简单工厂模式(又称静态工厂方法模式)

        由三部分构成:抽象产品(具体产品共有的方法)、具体产品(继承或实现了抽象产品)、工厂(生成具体产品的实例)。缺点是扩展性差。

  • 抽象产品,它一般是具体产品继承的父类或实现的接口。在java中由接口或者抽象类来实现。

  • 具体产品,工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

  • 工厂类,这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

(1) 抽象产品(手机)

public abstract class Phone { 
    public abstract void call(); 
}

(2) 具体产品(小米、华为、OPPO)

public class XiaoMi extends Phone { 
    @Override 
    public void call() { 
        System.out.println("小米"); 
    } 
} 

public class HuaWei extends Phone { 
    @Override 
    public void call() { 
        System.out.println("华为"); 
    } 
} 

public class Oppo extends Phone { 
    @Override 
    public void call() { 
        System.out.println("oppo"); 
    } 
}

(3) 工厂类1

public class SimplePhoneFactory { 
    public static Phone createPhone(String name) { 
        switch (name) { 
            case "xiaomi": 
                return new XiaoMi(); 
            case "huawei": 
                return new HuaWei(); 
            case "oppo": 
                return new Oppo(); 
        } 
    } 
}

        缺点:扩展性差,增加一种手机时,不仅需要新增一个手机产品类,还需要修改createPhone ();不同的产品需要不同额外参数的时候不支持。

(4) 工厂类2

public static <T extends Phone> T createPhone(Class<T> clazz) { 
    T instance = null; 
    try { 
        instance = (T) Class.forName(clazz.getName()).newInstance(); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } 
    return instance; 
}

        优点:增加一种手机时,不需要修改createPhone ()

        缺点:反射的效率问题;Class.forName(clazz.getName()).newInstance()调用的是无参构造函数生成对象,它和new Object()是一样的性质,而工厂应该用于复杂对象的初始化 ,当需要调用有参的构造函数时便无能为力了;不同的产品需要不同额外参数的时候不支持。

2、工厂方法模式

        由四部分构成:抽象产品(具体产品共有的方法)、具体产品(继承或实现了抽象产品)、抽象工厂(具体工厂共有的方法)、具体工厂(继承或实现了抽象工厂,负责返回具体产品的实例)。工厂方法模式不仅将产品抽象出来,而且将工厂也抽象出来。

  • 抽象产品:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

  • 具体产品:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

  • 抽象工厂:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

  • 具体工厂:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。

        优点:使一个产品类的实例化延迟到其具体工厂类;当需求变化,只需要增删相应的具体产品类和具体工厂类,不需要修改已有的类。而简单工厂需要修改工厂类的createPhone()方法。

        缺点:引入抽象工厂层后,每次新增一个具体产品类,也要同时新增一个具体工厂类。

(1) 抽象产品(手机)

public abstract class Phone { 
    public abstract void call(); 
}

(2) 具体产品(小米、华为、OPPO)

public class XiaoMi extends Phone { 
    @Override 
    public void call() { 
        System.out.println("小米"); 
    } 
} 

public class HuaWei extends Phone { 
    @Override 
    public void call() { 
        System.out.println("华为"); 
    } 
} 

public class Oppo extends Phone { 
    @Override 
    public void call() { 
        System.out.println("oppo"); 
    } 
}

(3) 抽象工厂

public abstract class PhoneFactory { 
    public abstract Phone createPhone(); 
}

(4) 具体工厂(小米、华为、OPPO)

public class XiaoMiFactory extends PhoneFactory { 
    @Override 
    public Phone createPhone() { 
        return new XiaoMi(); 
    } 
} 

public class HuaWeiFactory extends PhoneFactory { 
    @Override 
    public Phone createPhone() { 
        return new HuaWei(); 
    } 
} 

public class OppoFactory extends PhoneFactory { 
    @Override 
    public Phone createPhone() { 
        return new Oppo(); 
    } 
}

3、抽象工厂模式

        由四部分构成:抽象产品(具体产品共有的方法)、具体产品(继承或实现了抽象产品)、抽象工厂(具体工厂共有的方法)、具体工厂(继承或实现了抽象工厂,负责返回具体产品的实例)。抽象工厂模式适用于多个产品族(手机为一个产品族,电脑为另一个产品族,也就是说有多个抽象产品)

  • 抽象产品:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

  • 具体产品:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

  • 抽象工厂:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

  • 具体工厂:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。

(1) 抽象产品(手机)

public abstract class Phone { 
    public abstract void call(); 
}

(2) 具体产品(小米、华为、OPPO)

public class XiaoMi extends Phone { 
    @Override 
    public void call() { 
        System.out.println("小米"); 
    } 
} 

public class HuaWei extends Phone { 
    @Override 
    public void call() { 
        System.out.println("华为"); 
    } 
} 

public class Oppo extends Phone { 
    @Override 
    public void call() { 
        System.out.println("oppo"); 
    } 
}

(3) 抽象产品(电脑)

public abstract class Computer { 
    public abstract void Coding(); 
}

(4) 具体产品(dell、联想)

public class Dell extends Computer { 
    @Override 
    public void Coding() { 
        System.out.println("戴尔"); 
    } 
} 

public class Lenovo extends Computer { 
    @Override 
    public void Coding() { 
        System.out.println("联想"); 
    } 
}

        由四部分构成:抽象产品(具体产品共有的方法)、具体产品(继承或实现了抽象产品)、抽象工厂(具体工厂共有的方法)、具体工厂(继承或实现了抽象工厂,负责返回具体产品的实例)。抽象工厂模式适用于多个产品族(手机为一个产品族,电脑为另一个产品族,也就是说有多个抽象产品)

(5) 抽象工厂

public abstract class ITFactory { 
    public abstract Phone createPhone(); 
    public abstract Computer createComputer(); 
}

(6) 具体工厂

public class MicrosoftFactory extends ITFactory { 
    @Override 
    public Phone createPhone() { 
        return new XiaoMi(); 
    } 

    @Override 
    public Computer createComputer() { 
        return new Dell(); 
    } 
} 

public class IBMFactory extends ITFactory { 
    @Override 
    public Phone createPhone() { 
        return new HuaWei(); 
    } 
    
    @Override 
    public Computer createComputer() { 
        return new Lenovo(); 
    } 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值