学习下java设计模式(创建者模式)

虽然在平时开发中一直用、但是没系统学习过这些设计模式、所以特地翻翻网上资料来总结下所谓设计模式尴尬

还记得第一次写的算法题是八皇后、当时用循环把所有情况列举出来然后筛选、直到在一年后才知道那种方法叫穷举吐舌头



一、工厂模式(Factory Method)

1.普通工厂模式

算是工厂模式的基础、对实现同一接口的不同类进行创建、以传参进行区分、譬如:

接口

public interface Animal {
    public void shut();
}
实现类

public class Dog implements Animal(){
	public void shut(){
		System.out.println("wang wang!");
	}
}
public class Duck implements Animal(){
	public void shut(){
		System.out.println("gua gua!");
	}
}
工厂类

public class Factory{
	public Animal produce(String name){
		if("dog".equals(name)){
			return new Dog();
		}else if("duck".equals(name)){
			return new Duck();
		}
		return null;
	}
}
测试类

public class Test {
    public static void main(String[] args) {
        Factory factory = new Factory();
        Animal dog = factory.produce("dog");
        dog.shut();
    }
}
输出:wang wang!

2.多个工厂方法模式

与普通工厂模式差异主要在于由单一produce创建实例改为多个方法创建不同实例

接口与实现类同上、工厂类方法变更

public class Factory {
    public Animal produceDog() {
        return new Dog();
    }

    public Animal produceDuck() {
        return new Duck();
    }
}
测试类

public class Test {
    public static void main(String[] args) {
        Factory factory = new Factory();
        Animal duck = factory.produceDuck();
        duck.shut();
    }
}
输出:gua gua!
看别的文章里说多个工厂方法模式比普通工厂模式要好、不会因为传入参数异常而导致创建不了实例、但这两种模式在扩展类的时候、都需要对工厂类进行修改

3.静态工厂模式

该模式只需在普通工厂模式或多个工厂方法模式基础上、对produce方法加上static修饰、省去每次创建实例时都需要先创建工厂再创建所需要实例的步骤

工厂类(基于多个工厂方法模式)

public class Factory {
    public static Animal produceDog() {
        return new Dog();
    }

    public static Animal produceDuck() {
        return new Duck();
    }
}
测试类
public class Test {
    public static void main(String[] args) {
        Animal duck = Factory.produceDuck();
        duck.shut();
    }
}
输出:gua gua!

二、抽象工厂模式(Abstract Factory)

在工厂模式中我提到对于拓展新类的时候、需要去修改工厂类才能实现新类的添加创建功能、那么就会频繁修改工厂类、这并不是我们愿意看到的情况;

所以在抽象工厂模式中、我们将工厂类的创建实例方法也拿出来放入接口中、对于不同的创建实例需求来提供不同工厂的实现类

工厂类接口

public interface AnimalFactory {
    public Animal produce();
}
两个工厂类接口的实现类

public class DogFactory implements AnimalFactory {
    public Animal produce() {
        return new Dog();
    }
}
public class DuckFactory implements AnimalFactory {
    public Animal produce() {
        return new Duck();
    }
}
测试类

public class Test {
    public static void main(String[] args) {
        AnimalFactory dogFactory = new DogFactory();
        Animal dog = dogFactory.produce();
        dog.shut();
    }
}
输出:wang wang!
抽象工厂模式中解决了在拓展功能时需要改动原工厂类代码的弊端、只要在拓展新类的时候拓展一个相应的工厂实现类即可


三、单例模式(Singleton)

单例模式原则上对于同一类在内存中只有一个实例

优点:

1.节省开支、对于需要反复创建使用的类、省去了cpu消耗及内存消耗

2.在实际业务中、可以确立相关属性方法等的唯一性、例如在公司首页中设立单例、可统计访客次数

单例工厂

public class Singleton {
    private Animal animal = null;

    public static Animal produce() {
        if (animal == null) {
            animal = new Dog();
        }

        return animal;
    }
}
单例模式中设计序列化与多线程等问题、稍后编辑 得意


四、建造者模式(Builder)

在前三种工厂模式中、都只能在一次生产中创建一个产品、而在建造者模式中可以创建多个产品

工厂类

public class Builder {
    public List<Animal> produceDog(int count) {
        List<Animal> list = new ArrayList<Animal>();

        for (int i = 0; i < count; i++) {
            list.add(new Dog());
        }

        return list;
    }
}
这里只创建了单一功能类的多个实例、但是在实际应用中可以根据需要改变建造者模式的具体实现方式、与创建单个实例来说并没有孰优孰劣、主要还是根据需要来选择


五、原型模式(Prototype)

以一个对象作为原型、对其进行克隆、产生一个与其相同的新对象

原型模式属于创建型模式但不属于工厂模式、直接调用需要克隆对象的clone方法即可实现、而如果对clone方法进行重写、需实现Cloneable接口并重写clone方法

直接调用Object的clone方法为浅复制

关键词:浅复制、深复制

重写clone方法

public class Prototype implements Cloneable {
    public Object clone() {
        return super.clone();
    }
}


以上五种为创建者模式、在实际应用中可根据需求来选择甚至组合使用、接下来为结构型模式


六、适配器模式(Adapter)

七、装饰模式(Decorator)
八、代理模式(Proxy)

九、外观模式(Facede)

十、桥接模式(Bridge)

十一、组合模式(Composite)

十二、享元模式(Flyweight)








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值