设计模式--工厂模式

目录

简单工厂模式

需求

基本介绍

代码示例

工厂方法模式

需求

基本介绍

代码示例

抽象工厂模式

基本介绍

代码示例

小结


简单工厂模式

需求

做一个披萨的项目:要便于披萨种类的拓展,要便于维护

  1. 披萨的种类很多
  2. 披萨的制作有prepare,bake,cut,box
  3. 完成披萨店订购功能

基本介绍

  • 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实施。简单工厂模式是工厂模式家族中最简单实用的模式。
  • 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
  • 在软件开发中,当我们会用到大量的创建某种、某类或某批对象时,就会使用到工厂模式

代码示例

package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:28
 * @Desc 披萨抽象类
 */
public abstract class Pizza {
    private String name;

    abstract void prepare();

    public void bake(){
        System.out.println(name + "披萨正在制作");
    }

    public void cut(){
        System.out.println(name + "披萨正在切割");
    }

    public void box(){
        System.out.println(name + "披萨正在打包");
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:32
 * @Desc 至尊披萨
 */
public class SupremePizza extends Pizza{

    @Override
    void prepare() {
        System.out.println("正在准备原材料");
    }


}
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:33
 * @Desc 美式披萨
 */
public class AmericanPizza extends Pizza{
    @Override
    void prepare() {
        System.out.println("正在准备原材料");
    }

}
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:34
 * @Desc
 */
public class SimpleFactory {

    public static Pizza createPizza(String pizzaType){
        Pizza pizza = null;
        if(pizzaType.equals("supreme")){
            pizza = new SupremePizza();
            pizza.setName("至尊");
        }else if(pizzaType.equals("american")){
            pizza = new AmericanPizza();
            pizza.setName("美式");
        }
        return pizza;
    }

}
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:36
 * @Desc 订购披萨
 */
public class OrderPizza {

    Pizza pizza = null;

    public OrderPizza(String pizzaType){
        pizza = SimpleFactory.createPizza(pizzaType);
        if(pizza == null){
            System.out.println("订购披萨失败:为找到相应的披萨种类");
        }else{
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:28
 * @Desc 披萨的客户端
 */
public class PizzaStore {

    public static void main(String[] args) {
        new OrderPizza("supreme");
    }
}

工厂方法模式

需求

在点披萨时,可以点不同的口味,比如:北京的奶酪披萨,北京的胡椒披萨

基本介绍

  • 工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
  • 工厂方法模式:定义一个创建对象的抽象方法,由子类决定是要实例化的类。工厂方法模式将对象的实例化推迟到子类。

代码示例

package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:26
 * @Desc
 */
public abstract class Pizza {
    private String name;

    abstract void prepare();

    public void bake(){
        System.out.println(name + "披萨正在制作");
    }

    public void cut(){
        System.out.println(name + "披萨正在切割");
    }

    public void box(){
        System.out.println(name + "披萨正在打包");
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 伦敦胡椒
 */
public class LDPepperPizza extends Pizza{

    @Override
    void prepare() {
        setName("伦敦胡椒");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 伦敦奶酪
 */
public class LDCheesePizza extends Pizza{

    @Override
    void prepare() {
        setName("伦敦奶酪");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 北京胡椒
 */
public class BJPepperPizza extends Pizza{

    @Override
    void prepare() {
        setName("北京胡椒");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 北京奶酪
 */
public class BJCheesePizza extends Pizza{

    @Override
    void prepare() {
        setName("北京奶酪");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:29
 * @Desc
 */
public abstract class OrderPizza {

    abstract Pizza createPizza(String orderType);

    public OrderPizza(String orderType){
        Pizza pizza = createPizza(orderType);
        if(pizza == null){
            System.out.println("订购披萨失败:为找到相应的披萨种类");
        }else{
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:34
 * @Desc
 */
public class LDOrderPizza extends OrderPizza{

    public LDOrderPizza(String orderType) {
        super(orderType);
    }

    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if(orderType.equals("cheese")){
            pizza = new LDCheesePizza();
        }else if(orderType.equals("pepper")){
            pizza = new LDCheesePizza();
        }
        return pizza;
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:34
 * @Desc
 */
public class BJOrderPizza extends OrderPizza{

    public BJOrderPizza(String orderType) {
        super(orderType);
    }

    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if(orderType.equals("cheese")){
            pizza = new BJCheesePizza();
        }else if(orderType.equals("pepper")){
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 13:28
 * @Desc 披萨的客户端
 */
public class PizzaStore {

    public static void main(String[] args) {
        new BJOrderPizza("cheese");
    }
}

抽象工厂模式

基本介绍

  • 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
  • 抽象工厂模式可以将简单工厂模式和工厂方法模式整合
  • 从设计层面看,抽象工厂模式就是对简单工厂模式的改进
  • 将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样就将单个的简单工厂类变成了工厂簇,更利于代码的维护和拓展。

代码示例

package com.zjb.design.factory.absfactory;

/**
 * @Author Kim
 * @Date 2022/4/23 14:58
 * @Desc
 */
public interface AbsFactory {

    Pizza createPizza(String pizzaType);
}
package com.zjb.design.factory.absfactory;

/**
 * @Author Kim
 * @Date 2022/4/23 14:59
 * @Desc
 */
public class BJFactory implements AbsFactory{

    @Override
    public Pizza createPizza(String pizzaType) {
        Pizza pizza = null;
        if(pizzaType.equals("cheese")){
            pizza = new BJCheesePizza();
        }else if(pizzaType.equals("pepper")){
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
package com.zjb.design.factory.absfactory;

/**
 * @Author Kim
 * @Date 2022/4/23 14:59
 * @Desc
 */
public class LDFactory implements AbsFactory{
    @Override
    public Pizza createPizza(String pizzaType) {
        Pizza pizza = null;
        if(pizzaType.equals("cheese")){
            pizza = new LDCheesePizza();
        }else if(pizzaType.equals("pepper")){
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}
package com.zjb.design.factory.absfactory;


/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 北京奶酪
 */
public class BJCheesePizza extends Pizza {

    @Override
    void prepare() {
        setName("北京奶酪");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.absfactory;


/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 北京胡椒
 */
public class BJPepperPizza extends Pizza {

    @Override
    void prepare() {
        setName("北京胡椒");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.absfactory;


/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 伦敦胡椒
 */
public class LDPepperPizza extends Pizza {

    @Override
    void prepare() {
        setName("伦敦胡椒");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.absfactory;


/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 伦敦奶酪
 */
public class LDCheesePizza extends Pizza {

    @Override
    void prepare() {
        setName("伦敦奶酪");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.absfactory;


/**
 * @Author Kim
 * @Date 2022/4/23 14:29
 * @Desc
 */
public class OrderPizza {

    public OrderPizza(AbsFactory absFactory,String orderType){
        Pizza pizza = absFactory.createPizza(orderType);
        if(pizza == null){
            System.out.println("订购披萨失败:为找到相应的披萨种类");
        }else{
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}
package com.zjb.design.factory.absfactory;

/**
 * @Author Kim
 * @Date 2022/4/23 13:28
 * @Desc 披萨的客户端
 */
public class PizzaStore {

    public static void main(String[] args) {

        new OrderPizza(new BJFactory(),"cheese");
    }
}

小结

  1. 工厂模式的意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的拓展和维护性
  2. 设计模式的依赖抽象原则
  • 在创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中并返回
  • 不要让类继承具体类,而是继承抽象类或者是实现interface接口
  • 不要覆盖基类中已经实现的方法 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式是一组经过实践验证的面向对象设计原则和模式,可以帮助开发人员解决常见的软件设计问题。下面是常见的23种设计模式: 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory Method Pattern) - 抽象工厂模式(Abstract Factory Pattern) - 单例模式(Singleton Pattern) - 原型模式(Prototype Pattern) - 建造者模式(Builder Pattern) 2. 结构型模式(Structural Patterns): - 适配器模式(Adapter Pattern) - 桥接模式(Bridge Pattern) - 组合模式(Composite Pattern) - 装饰器模式(Decorator Pattern) - 外观模式(Facade Pattern) - 享元模式(Flyweight Pattern) - 代理模式(Proxy Pattern) 3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility Pattern) - 命令模式(Command Pattern) - 解释器模式(Interpreter Pattern) - 迭代器模式(Iterator Pattern) - 中介者模式(Mediator Pattern) - 备忘录模式(Memento Pattern) - 观察者模式(Observer Pattern) - 状态模式(State Pattern) - 策略模式(Strategy Pattern) - 模板方法模式(Template Method Pattern) - 访问者模式(Visitor Pattern) 4. 并发型模式(Concurrency Patterns): - 保护性暂停模式(Guarded Suspension Pattern) - 生产者-消费者模式(Producer-Consumer Pattern) - 读写锁模式(Read-Write Lock Pattern) - 信号量模式(Semaphore Pattern) - 线程池模式(Thread Pool Pattern) 这些设计模式可以根据问题的特点和需求来选择使用,它们提供了一些可复用的解决方案,有助于开发高质量、可维护且易于扩展的软件系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值