2023.03.21设计模式-----工厂模式、抽象工厂、适配器模式

目录

设计模式分类:

  工厂模式:

抽象工厂模式

适配器模式-----作为两个接口不兼容的桥梁 


设计模式分类:

设计模式分三类,一共23中
   创建型模式:单例模式、抽象工厂、工厂模式、原型模式、建造者模式
   结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、

                         代理模式
   行为型模式: 模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、访问者模式、责任链模式 

 

  工厂模式:

 设计意图:定义一个创建对象的接口,让其子类去决定具体实现哪个接口
   主要解决的问题:接口的选择问题
   什么时候使用:不同条件下创建不同的实例
   关键代码:创建过程在子类执行
   使用场景: 日志记录  数据库访问 
 

public interface Shape {
    public void draw();
}
public class Rict implements Shape{
    @Override
    public void draw() {
        System.out.println("我是矩形");
    }
}
public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("我是一个圆");
    }
}
public class ShapeFactory {
    public static Shape getShape (String shapes){
        if(shapes.equalsIgnoreCase("circle")){
            return new Circle();
        }else if(shapes.equalsIgnoreCase("rict")){
            return new Rict();
        }
        return null;
    }
}
public class TestShape {
    public static void main(String[] args) {
        Shape shapes = ShapeFactory.getShape("circle");
        shapes.draw();
    }
}

总结: 在图形工厂里面写一个getShape的方法,根据参数去判定,然后返回自己想要实例的对象,然后直接调用实现接口的方法。

抽象工厂模式

设计意图: 提供了一个创建一系列相关或者互相依赖的接口,无需指定它们具体的类
主要解决的问题:接口选择的问题 
什么时候使用:系统中有多于一个产品,而系统中只是消费其中一个产品
关键代码:在一个工厂里面聚合多个产品
使用场景: QQ皮肤一整套一整套的换!
                生成不同的产品

public interface Color {
    public void fill();
}




public class Red implements Color{
    @Override
    public void fill() {
        System.out.println("填充红色");
    }
}


public class Green implements Color{
    @Override
    public void fill() {
        System.out.println("填充绿色");
    }
}




public class ColorFactory extends AbstactFactory{
    @Override
    public Shape getShape(String shapes) {
        return null;
    }
    @Override
    public Color getColor(String colors) {
        if(colors==null){
            return null;
        }
        if(colors.equalsIgnoreCase("green")){
            return new Green();
        }else if(colors.equalsIgnoreCase("red")){
            return new Red();
        }
        return null;
    }
}
public interface Shape {
    public void draw();
}


public class Rect implements Shape{
    @Override
    public void draw() {
        System.out.println("我是一个矩形");
    }
}

public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("我是一个圆");
    }
}




public class ShapeFactory extends AbstactFactory{
    @Override
    public Shape getShape(String shapes) {
        if(shapes==null){
            return null;
        }
        if(shapes.equalsIgnoreCase("circle")){
            return new Circle();
        }else if(shapes.equalsIgnoreCase("rict")){
            return new Rect();
        }
        return null;
    }
    @Override
    public Color getColor(String colors) {
        return null;
    }
}
public class SuperFactory {
public static AbstactFactory getFactory(String factory){
    if(factory==null){
        return null;
    }
    if(factory.equalsIgnoreCase("color")){
        return new ColorFactory();
    }else if(factory.equalsIgnoreCase("shape")){
        return new ShapeFactory();
    }

    return null;
}
}





public class TestFactory {

    public static void main(String[] args) {
        AbstactFactory color = SuperFactory.getFactory("color");
        Color green = color.getColor("green");
        green.fill();
    }
}

总结:抽象工厂,就是当存在多个工厂的时候,同样需要参数去判定你到底想要选择哪个工厂,然后根据工厂再去给参数,再次返回你想要实例的对象,最后调用方法,输出你想要的结果,就是用两个get去实现。一定要去创建抽象类--抽象工厂,有几个工厂,抽象类就放几个抽象方法,不同工厂继承抽象类,就去实现属于自己的方法,方法根据参数判定条件去返回实例对象。

适配器模式-----作为两个接口不兼容的桥梁 

public interface MediumMediaPlayer{
    public void playM3(String fileName);
    public void playM4(String fileName);
}



public class Mp3Player implements MediumMediaPlayer{
    @Override
    public void playM3(String fileName) {
        System.out.println("正在播放的歌曲是:"+fileName);
    }
    @Override
    public void playM4(String fileName) {
    }
}


public class Mp4Player implements MediumMediaPlayer{
    @Override
    public void playM3(String fileName) {
    }
    @Override
    public void playM4(String fileName) {
        System.out.println("正在播放的电影是"+fileName);
    }
}
public interface MediaPlayer {
    public void play(String types,String fileName);
}



public class MediaAdapter implements MediaPlayer{
    MediumMediaPlayer mediumMediaPlayer;
    public MediaAdapter(String aduiotype){
        if (aduiotype.equalsIgnoreCase("mp3")){
            mediumMediaPlayer=new Mp3Player();
        }else if(aduiotype.equalsIgnoreCase("mp4")){
            mediumMediaPlayer=new Mp4Player();
        }
    }
    @Override
    public void play(String types, String fileName) {
        if(types.equalsIgnoreCase("mp3")){
             mediumMediaPlayer.playM3(fileName);
        }else if(types.equalsIgnoreCase("mp4")){
            mediumMediaPlayer.playM4(fileName);
        }

    }
}

public class AudioPlayer implements MediaPlayer{

    MediaAdapter mediaAdapter;

    @Override
    public void play(String types, String fileName) {
       if(types.equalsIgnoreCase("mp3")){
           System.out.println("音乐"+fileName);
           mediaAdapter=new MediaAdapter(types);
           mediaAdapter.play(types,fileName);
       }else if(types.equalsIgnoreCase("mp4")){
           System.out.println("视频"+fileName);
           mediaAdapter=new MediaAdapter(types);
           mediaAdapter.play(types,fileName);
       }
    }
}

public class Test03 {
    public static void main(String[] args) {
        AudioPlayer audioPlayer=new AudioPlayer();
        audioPlayer.play("mp4","绿皮书");
        audioPlayer.play("mp3","说好不哭");
    }
}

总结:

第一步:创建接口(接口方法的参数只有文件名),返回值void的方法,创建两个不同类型的文件,实现接口。

第二步:创建接口(接口方法的参数有文件类型,有文件名)接着让适配器实现这个接口,并且根据文件类型判断,实例化一个播放器对象(是MP3,还是MP4),调用方法。

第三步:实现第二步的接口,同样的参数,还是根据不同的文件类型,可以输出其他东西,然后将参数代入到适配器的方法里面。

第四步:测试;

适配器就是将

1.适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容
2.从用户的角度看不到被适配者,是解耦的
3.用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值