Java中的设计模式(一)

Java中一般认为有23中设计模式,总体上可分为三类:

创建型模式(5种):工厂方法模式抽象方法模式单例模式建造者模式,原型模式

结构型模式(7种):适配器模式,装饰器模式,代理模式, 外观模式,桥接模式,组合模式,享元模式

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

一,工厂设计模式

工厂模式分为工厂方法模式和抽象工厂模式

工厂方法模式又分为三种:

  普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

  多工厂模式:是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

  静态工厂方法模式:将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

普通工厂模式:

扫描二维码关注公众号,回复: 7046793 查看本文章
public interface Sender {
    public void send();
}
public class MailSender implements Sender {
    @Override
    public void send() {
        System.out.println("this is mail sender");
    }
}
public class SmsSender implements Sender {
    @Override
    public void send() {
        System.out.println("this is sms sender");
    }
}
public class Factory1 {

    public Sender produce(String type){
        if ("mail".equals(type)){
            return new MailSender();
        }else if ("sms".equals(type)){
            return new SmsSender();
        }else {
            System.out.println("请输入正确的类型");
            return null;
        }
    }


    public static void main(String[] args) {
        Factory1 factory1 = new Factory1();
        Sender sms = factory1.produce("sms");
        sms.send();
        Sender aa = factory1.produce("aa");
        aa.send();
    }

}

多工厂模式:

该模式是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

public class Factory2 {

    public Sender produceMail(){
        return new MailSender();
    }

    public Sender produceSms(){
        return new SmsSender();
    }


    public static void main(String[] args) {
        Factory2 factory1 = new Factory2();
        Sender sms = factory1.produceSms();
        sms.send();
    }

}

静态工厂方法模式:

将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

public class Factory3 {

    public static Sender produceMail(){
        return new MailSender();
    }

    public static Sender produceSms(){
        return new SmsSender();
    }


    public static void main(String[] args) {
        Sender mail = Factory3.produceMail();
        mail.send();
    }
}

二,抽象工厂模式

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

public interface Provider {
    public Sender produce();
}
public interface Sender {
    public void send();
}
public class Smssender implements Sender{
    @Override
    public void send() {
        System.out.println("this sms send");
    }
}
public class MailSender implements Sender{

    @Override
    public void send() {
        System.out.println("this mail send");
    }
}
public class SendMailFactory implements Provider{

    @Override
    public Sender produce() {
        return new MailSender();
    }
}
public class SendSmsFactory implements Provider{

    @Override
    public Sender produce() {
        return new SmsSender();
    }
}
public class Test {
    public static void main(String[] args) {
        SendMailFactory sendMailFactory = new SendMailFactory();
        Sender sender = sendMailFactory.produce();
        sender.send();
    }
}

三,建造者模式

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的 Test 结合起来得到的。

public interface Sender {
    public void send();
}
public class Smssender implements Sender{
    @Override
    public void send() {
        System.out.println("this sms send");
    }
}
public class MailSender implements Sender{

    @Override
    public void send() {
        System.out.println("this mail send");
    }
}
public class Builder {
    private List<Sender> list = new ArrayList<>();

    public void produceMailSender(int count){
        for (int i = 0; i < count; i++) {
            list.add(new MailSender());
        }
    }

    public void produceSmsSender(int count){
        for (int i = 0; i < count; i++) {
            list.add(new Smssender());
        }
    }
}
public class TestBuilder {

    public static void main(String[] args) {
        Builder builder = new Builder();
        builder.produceMailSender(5);
    }
}

猜你喜欢

转载自www.cnblogs.com/noperx/p/11367805.html