设计模式的作用:解耦,复用,减少代码的开发量。为了后期易于维护。
设计模式遵循的原则:1.单一原则(理解例如:狗这个类,只能做狗能干的事。它不能像猫一样上树去抓老鼠)
2.开闭原则(理解例如:对于扩展开发,不可以修改已经开发好的功能)
3.里氏代换原则(理解例如:所有引用父类的地方可以透明的引用子类,但是子类反过来是不可以引用父类的)
4.依赖导致原则:(理解例如:在平时的程序中我们一般只传入实现类为参数,但是如果后期想新增某个功能时,我们往往实现这个接口。这时我们可以将参数修改成这个接口。但是可以通过多态的机制选择具体去调用那个实现)
5.接口隔离原则
6.迪米特原则
设计模式分为四大类型如下:
创建型模式(5种):工厂方法模式(工厂模式),抽象工厂模式,单例模式,建造者模式,原型模式。
结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
这里我挑一些常用的说说:工厂方法模式(工厂模式),抽象工厂模式,单例模式,适配器模式,代理模式
工厂方法模式包含四个部分:
1.抽象产品:产品对象同一的基类,或者是同一的接口。
2.具体的产品:各个不同的实例对象类
3.抽象工厂:所有的子类工厂类的基类,或是同一的接口
4.具体的工厂子类:负责每个不同的产品对象的实际创建
一句话就是,定一个抽象的接口,定义方法,该方法没有返回值。让别的类来实现该接口。在定义一个抽象工厂的接口,定义方法,该方法返回上个定义的抽象类。然后在让其他类实现定义好的抽象工厂,然后实现该抽象工厂的实现工厂类,在实现工厂类里面创建一个抽象接口的实现类。然后返回该抽象接口的实现类。
工厂方法模式(工厂模式):
package factory.simple;
/**
此类为抽象接口
* 抽象产品角色 交通工具接口*
* @author lilin
*
*/
public interface Car {
/**
* 上班函数
*/
void gotowork();
}
package factory.simple;
/**
抽象接口的实现类
* 具体产品角色,自行车*
* @author lilin
*
*/
public class Bike implements Car {
@Override
public void gotowork() {
System.out.println("骑自行车去上班!");
}
}
package factory.simple;
/**
抽象接口的实现类
* @author lilin*
*/
public class Bus implements Car {
@Override
public void gotowork() {
System.out.println("坐公交车去上班!");
}
}
/**
*
抽象接口的工厂类
*/package factory.factory;
import factory.simple.Car;
/**
* @author lilin
*
*/
public interface ICarFactory {
/**
* 获取交通工具
*
* @return
*/
Car getCar();
}
/**
*
*/
package factory.factory;
import factory.simple.Bike;
import factory.simple.Car;
/**
抽象工厂类的实现类
* @author lilin*
*/
public class BikeFactory implements ICarFactory {
@Override
public Car getCar() {
return new Bike();
}
}
/**
*
*/
package factory.factory;
import factory.simple.Bus;
import factory.simple.Car;
/**
抽象工厂类的实现类
*
*/
public class BusFactory implements ICarFactory {
@Override
public Car getCar() {
return new Bus();
}
}
/**
*
*/
package factory.factory;
import org.testng.annotations.Test;
import factory.simple.Car;
/**
测试类
* @author lilin*
*/
public class TestFactory {
@Test
public void test() {
ICarFactory factory = null;
// bike
factory = new BikeFactory();
Car bike = factory.getCar();
bike.gotowork();
// bus
factory = new BusFactory();
Car bus = factory.getCar();
bus.gotowork();
}
}
打印结果如下:
骑自行车去上班!
坐公交车去上班!
抽象工厂模式:
package abstractFactory;
/**
*
* @author CIACs
*
*/
public interface Gift {
//声明产品赠品的接口,当然也可以是抽象类,同样为了简单就不声明方法了
}
package abstractFactory;
/**
*
* @author CIACs
*
*/
public class GiftA implements Gift {
public GiftA()
{
System.out.println("GiftA");
}
}
package abstractFactory;
/**
*
* @author CIACs
*
*/
public class GiftB implements Gift {
public GiftB()
{
System.out.println("GiftB");
}
}
package abstractFactory;
/**
*
* @author CIACs
*声明Product类工厂和Gift类工厂的工同工厂接口
*/
public interface Factory {
public Product createProduct();
public Gift createGift();
}
package abstractFactory;
/**
*
* @author CIACs
*FactoryA可以生成ProductA和GiftA
*/
public class FactoryA implements Factory {
@Override
public Product createProduct()
{
return new ProductA();
}
@Override
public Gift createGift()
{
return new GiftA();
}
}
package abstractFactory;
/**
*
* @author CIACs
*FactoryB可以生成ProductB和GiftB
*/
public class FactoryB implements Factory {
@Override
public Product createProduct() {
return new ProductB();
}
@Override
public Gift createGift() {
return new GiftB();
}
}
package abstractFactory;
/**
*
* @author CIACs
*
*/
public class Client {
public static void main(String[] args) {
Factory factory;
factory = new FactoryA();
factory.createProduct();
factory.createGift();
factory = new FactoryB();
factory.createProduct();
factory.createGift();
}
}
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。