GOF23—工厂设计模式练习代码和随笔

GOF23—工厂设计模式练习代码和随笔

GOF23学习练习代码

创建型设计模式

一、工厂方法

GOF23---工厂设计模式练习代码和随笔

GOF23---工厂设计模式练习代码和随笔

1.工厂类

/** * 抽象工厂 */
public interface PayFactory{
   

     Pay getPayProduct();

}
public class AlipayFactory implements PayFactory {
   
    @Override
    public Pay getPayProduct() {
   
        return new AlipayProduct();
    }
}
public class WechatPayFactory implements PayFactory {
   
    @Override
    public Pay getPayProduct() {
   
        return new WechatPayProduct();
    }
}

2.产品类

public interface Pay {
   

    //下订单
     void placeAnOrder();
}
public class AlipayProduct implements Pay {
   
    @Override
    public void placeAnOrder() {
   
        System.out.println("支付宝支付.........");
    }
}
public class WechatPayProduct implements  Pay {
   
    @Override
    public void placeAnOrder() {
   
        System.out.println("微信支付....");
    }
}

3.ProductClient

public class PayClient {
   
    public static void main(String[] args) {
   
        PayFactory payFactory = new AlipayFactory();
        payFactory.getPayProduct().placeAnOrder();

        System.out.println("---------------------------------------------------");

        payFactory = new WechatPayFactory();
        payFactory.getPayProduct().placeAnOrder();
    }
}

二、抽象工厂

GOF23---工厂设计模式练习代码和随笔

GOF23---工厂设计模式练习代码和随笔

1.顶级工厂

/** * 顶级工厂,里面需要创建子工厂{子工厂抽象层面} */
public interface OrderFactory {
   

    PayFactory getPayFactory();

    RefunFactory getRefunFactory();

}

2.产品行为规范和具体产品

public interface PayFactory {
   
   //支付下单行为规范
    void pay();
}
public interface RefunFactory {
   
    //退款行为规范
     void refun();
}
public class AliPay implements PayFactory {
   
    @Override
    public void pay() {
   
        System.out.println("支付宝支付 进行下单 ................................");
    }
}
public class AliRefunPay implements RefunFactory {
   
    @Override
    public void refun() {
   
        System.out.println("支付宝支付后 用户不满意进行退款..................................");
    }
}

===>添加微信支付

public class WechatPay implements PayFactory {
   
    @Override
    public void pay() {
   
        System.out.println("微信支付进行支付下单...............................");
    }
}
public class WechatRefunPay implements RefunFactory {
   
    @Override
    public void refun() {
   
        System.out.println("微信支付后用户申请退款.............................");
    }
}

3.子工厂创建

public class AliOrderPay implements OrderFactory {
   
    @Override
    public PayFactory getPayFactory() {
   
        return new AliPay();
    }

    @Override
    public RefunFactory getRefunFactory() {
   
        return new AliRefunPay();
    }

}

*====> 微信产品维度的子工厂*

public class WechatOrderPay implements OrderFactory {
   
    @Override
    public PayFactory getPayFactory() {
   
        return new WechatPay();
    }

    @Override
    public RefunFactory getRefunFactory() {
   
        return new WechatRefunPay();
    }
}

4.使用简单工厂创建工厂

public class FactoryProduct {
   

    public static OrderFactory getFactory(String type){
   
        if("ali".equalsIgnoreCase(type)){
   
            return new AliOrderPay();
        }
        if("Wechat".equalsIgnoreCase(type)){
   
            return new WechatOrderPay();
        }
        return null;

    }

}

*====>思考? 如果这里使用工厂方法了?——*

5.Client

public class Client {
   
    public static void main(String[] args) {
   
        OrderFactory orderFactory = FactoryProduct.getFactory("ali");
       orderFactory.getPayFactory().pay();
        System.out.println("用户收到产品不满意需要进行退款操作");
        orderFactory.getRefunFactory().refun();
    }
}

=====>学习随笔记录:

一、创建型设计模式:

1.简单工厂
    把要创建的产品抽象化。-----抽象产品类 IProduct  |    public class  AppleProject implements IProject

    抽象产品类,用于描述所有实例共有的公共接口。 IProduce
    具体产品,实现抽象产品列的接口,工厂类穿件对象,如果有多个需要定义多个。Project

    

2.工厂方法:
    工厂进行抽象化。把类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,由子类决定应该实例化那个产品。


参与的角色:
    抽象产品类,用于描述所有实例共有的公共接口。 IProduce
    具体产品,实现抽象产品列的接口,工厂类穿件对象,如果有多个需要定义多个。Project


    抽象工厂,描述具体工厂的公共接口IFactory
    具体工厂类,实现创建产品类的对象,实现抽象工厂接口,如果有多个需要定义多个 Factrory

如何定义工厂?如何通过工厂创建产品对象?
工厂----可以是抽象类 , 也可以是接口.一般定义成接口,便于扩展。

如何通过工厂创建产品对象?


public class Factrory{

    public static IProduct getFactory(){
        return new Product(); 
    }

}

=======>抽象工厂和子工厂:
public interfact IFactory{
    IProduct getFactory();
}


public class Factrory implements IFactory{
    public IProduct getFactory(){
        return new Product();
    }
}



工厂方法是为了弥补简单工厂缺点。简单工厂的缺点是:当新增一种产品的时候需要修改简单工厂里面的代码,违背了开闭原则。


抽象工厂里面的方法返回值是抽象产品。  
满足:
最少知识原则 | 依赖倒置原则(针对接口编程,依赖于抽象不依赖于具体) | 里氏替换原则(多态的体现,任何基类可以出现的地方,子类一定可以出现)  | 开闭原则

 
3.抽象工厂
    产品族--业务域(可以理解成一系列相关的产品对象)  | 产品等级  由同一个工厂生产 一系列产品对象。


    顶级工厂(超级工厂)创建子工厂     子工厂创建产品  [产品抽象化]   产品实现子工程,重写子工厂里面的方法。  
     顶级工厂里面的方法可以理解成要创建的产品的工厂,也就是顶级工厂的子工厂。子工厂去创建需要的产品


抽象工厂模式在Spring中应用广泛。

产品的多样化   |  工厂多样化     ---------------------    工厂里面方法的返回值 是产品对象,该产品对象即可是具体的产品对象,也可以是抽象产品对象(抽象产品工厂和产品)

需要设计模式方面的书籍请留言,免费赠送

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100724.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 设计模式之代理模式、适配器模式和外观模式

    编写基于另一组类的包装器接口是一项常见的API设计任务,例如,你的工作可能是维护一个大型的遗留代码库,相比重构所有代码,你更愿意审计一个新的,更简洁的API,以隐藏所有的底层遗留代码;或者你可能已经

    2021年12月19日
    52
  • 我的Java设计模式-原型模式

    我的Java设计模式-原型模式

    2022年3月7日
    43
  • visitor设计模式ppt_常用的设计模式

    visitor设计模式ppt_常用的设计模式动机Visitor是访问者的意思。数据结构中保存着元素。一般我们需要对元素进行处理,那么处理元素的代码放在哪里呢?最显然的方法就是放在数据结构的类中,在类中添加处理的方法。但是如果有很多处理,就比较麻烦了,每当增加一种处理,我们就不得不去修改表示数据结构的类。visitor模式就是用来解决这个问题的,visitor模式将数据结构的定义和处理分离开。也就是会新增一个访问者的类,将数据元素的处理交给访问者类,这样以后要新增处理的时候,只需要新增访问者就可以了。模式定义将更新(变更)封装到一个类中(访问

    2022年8月8日
    5
  • 软考中的设计模式[通俗易懂]

    软考中的设计模式[通俗易懂]软考中的设计模式

    2022年4月25日
    62
  • 一、设计模式-开篇—为什么我要去旅行? #和设计模式一起旅行#

    独学而无友,则孤陋而寡闻。——《礼记·学记》写在开篇,本篇是一个综合帖,里面可能会记录一些我的学习感受,也可能记录一些我学习的资料的说明,总之这就是一个大杂烩的博文。开篇杂谈最近学习一些技术之外的其他东西,怎么进行时间管理了,怎么坚持去做一件事情了,还是学到了一些其他的新的东西!做一件事情最难的是什么,是启动!启动之后最难是什么,是坚持!很多时候大的道理我们都懂,但…

    2022年2月27日
    51
  • PHP设计模式-工厂模式[通俗易懂]

    PHP设计模式-工厂模式[通俗易懂]PHP设计模式-工厂模式一、工厂模式概念工厂模式,顾名思义,像工厂的流水线,固定的规格,固定的材料,做固定的事情。工厂模式分为三种:简单工厂、工厂方法、抽象工厂,三种工厂的区别是,抽象工厂由多条产品线,而工厂方法只有一条产品线,是抽象工厂的简化。而工厂方法和简单工厂相对,大家初看起来好像工厂方法增加了许多代码但是实现的功能和简单工厂一样。但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客.

    2022年7月25日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号