一些设计模式的感想(下)
本篇简单描述7个设计模式,分别是:工厂模式(Factory Pattern),抽象工厂模式(Abstract Factory Pattern),代理模式(Proxy Pattern),观察者模式(Observer Pattern),访问者模式(Visitor Pattern),状态模式(State Pattern),备忘录模式(Memento Pattern)
1.工厂模式(Factory Pattern)
工厂模式是 Java 中最常用的设计模式之一。通过使用工厂模式,我们可以在不对客户端暴露代码内部逻辑的情况下使用一个共同的新接口来创建新的对象。
作用:将对象的创建延迟到创建对象的接口子类里,通过调用工厂类进行
优点:调用者只需知道想要创建对象的名字即可进行对象的创建,无需暴露代码内部逻辑,并且这样的代码可扩展性高,只需添加一个新的工厂类即可支持一个新对象的创建
缺点:增加了程序的复杂度
示例:
public interface Vehicle {
public void trans();
}
public class Plane implements Vehicle {
@Override
public void trans() {
System.out.println("飞机在天上");
}
}
public class Train implements Vehicle {
@Override
public void trans() {
System.out.println("火车在地上");
}
}
public class Ship implements Vehicle {
@Override
public void trans() {
System.out.println("轮船在海上");
}
}
public class VehicleFactory {
public Vehicle GetVehicle(String vehicleType)
{
if(vehicleType == null)
return null;
else if(vehicleType == "Plane")
return new Plane();
else if(vehicleType == "Train")
return new Train();
else if(vehicleType == "Ship")
return new Ship();
return null;
}
}
测试:
public class TestFactory {
@Test
public void testFacade()
{
VehicleFactory factory = new VehicleFactory();
Vehicle vehicle1 = factory.GetVehicle("Plane");
vehicle1.trans();
Vehicle vehicle2 = factory.GetVehicle("Train");
vehicle2.trans();
Vehicle vehicle3 = factory.GetVehicle("Ship");
vehicle3.trans();
}
}
结果:
2.抽象工厂模式(Abstract Factory Pattern)public class TestAbstractFactory {
抽象工厂模式是通过一个超级工厂创建其他工厂,每个被创建的工厂都能按照工厂模式创建对象。
作用:可以方便不同种类的多种对象的创建。
优点:可以保证客户端对对象的创建保持在同一种类
缺点:不易于扩展
示例:
public interface Vehicle {
public void trans();
}
public class Plane implements Vehicle {
@Override
public void trans() {
System.out.println("飞机在天上");
}
}
public class Train implements Vehicle {
@Override
public void trans() {
System.out.println("火车在地上");
}
}
public class Ship implements Vehicle {
@Override
public void trans() {
System.out.println("轮船在海上");
}
}
public interface BoardGame {
public void play();
}
public class ChessGame implements BoardGame {
@Override
public void play() {
System.out.println("这是象棋游戏");
}
}