首页 > 代码库 > java面向对象与设计模式(一)

java面向对象与设计模式(一)

设计原则:SOLID 可以说,五个设计原则各司其职。
单一职责原则(S):用于类的设计
开闭原则(O):总的指导思想
里氏替换原则(L):用于指导类继承的设计
接口隔离原则(I):用于指导接口的设计
依赖翻转原则(D):用于指导如何抽象

类之间的关系
继承=实现>组合>聚合>关联>依赖

UML表现
继承:带三角箭头的实线,箭头指向父类
实现:带三角箭头的虚线,箭头指向接口
组合:带实心菱形的实线,菱形指向整体
聚合:带空心菱形的实线,菱形指向整体
关联:带普通箭头的实线,指向被拥有者
依赖:带普通箭头的虚线,指向被使用者
简 单说明一下,《1》继承和实现是java自带的,属于强耦合关系;《2》组合和聚合是特殊的关联关系,关联关系体现在代码上就是作为成员变量,聚合关系要 强于关联关系,代码上往往会通过set()方法完成对成员变量的赋值,组合关系则更加强一些,往往在构造函数就完成了初始化,也就是说,在一般情况下,生 命周期上组合>聚合>关联;《3》依赖和关联恰恰相反,代码上一般不出现在成员变量。常见于局部变量、方法的参数或者对静态方法的调用。
 
设计模式:(经典23式)
设计模式的核心在于复用,如果单用,则成为累赘。

第零式 简单工厂模式。
预备知识:接口
接口能够隔离封装,为系统的可插拔性提供保证。在接口也抽象类的选择上,应该优先选择接口,只有需要为子类提供公共功能的时候,才需要考虑抽象类。
下面举个例子,说明接口的具体实现。
public interface product {
    
    public void createProduct();

}


public class conCreteProduct implements product {

    @Override
    public void createProduct() {
        // TODO Auto-generated method stub
        System.out.println("生产产品");
    }

}


public class user {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        product prod1 = new conCreteProduct();
        prod1.createProduct();
    }

}
上面这个例子虽然使用了接口隔离(并没有完全隔离),但是还是存在一些问题。那就是user需要知道具体实现。这样user和具体产品就存在着耦合关系。而增加一个工厂类则可以达到解除耦合的目的。
public interface product {
    
    public void createProduct();

}


public class conCreteProduct implements product {

    @Override
    public void createProduct() {
        // TODO Auto-generated method stub
        System.out.println("生产产品");
    }

}


public class factory {
    
    public void createProduct() {
        product prod1 = new conCreteProduct();
        prod1.createProduct();
    }

}


public class user {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        factory fact1 = new factory();
        fact1.createProduct();
    }

}
增加了factory类以后,user就可以不需要关注具体实现了。把生产商品的事情交给了工厂来处理。而自己则专注于消费产品就可以了。这对于一个产品来说,的确是得不偿失的。但如果产品的种类多的话,优势还是很明显的(user不需要考虑繁琐的创建过程)。
 
简单工厂模式的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建对象的类型,可以是接口,抽象类,也可以是具体的类。
 
简单工厂的本质是选择实现。优点在于帮助封装和解耦,缺点则在于增加了客户端复杂度以及不利于扩展子工厂。
 
简单工厂常采用静态方法来实现,所以有时被称作静态工厂。为了选择实现,还可以把选择的部分配置到配置文件当中去。
public interface product {
    
    public void makeProduct();

}


public class concreteProduct implements product {

    @Override
    public void makeProduct() {
        // TODO Auto-generated method stub
        System.out.println("中国制造");
    }

}



public class factory {
    
    public static product makeProduct() {

        Properties pro = new Properties();
        InputStream in = null;
        try {
            in = factory.class.getResourceAsStream("factory.properties");
            pro.load(in);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        product prod = null;
        try {
            prod = (product) Class.forName(pro.getProperty("product1")).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return prod;
        
    }
    
}


public class user {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        product prod = factory.makeProduct();
        prod.makeProduct();
    }

}


配置文件factory.properties

product1=No0.concreteProduct

java面向对象与设计模式(一)