虽然在平时开发中一直用、但是没系统学习过这些设计模式、所以特地翻翻网上资料来总结下所谓设计模式
还记得第一次写的算法题是八皇后、当时用循环把所有情况列举出来然后筛选、直到在一年后才知道那种方法叫穷举
一、工厂模式(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)