1.简单工厂设计模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
1.1简单工厂设计模式UML图:
1.2简单工厂设计模式实现代码:
public interface Food {
/*
* 获得相应的食物
*/
public void get();
}
public class McChicken implements Food{
/*
* 获取一份麦香鸡
*/
public void get(){
System.out.println("我要一份麦香鸡");
}
}
public class Chips implements Food{
/*
* 获取一份薯条
*/
public void get(){
System.out.println("我要一份薯条");
}
}
现在创建一个食物加工工厂
public class FoodFactory {
public static Food getFood(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
if(type.equalsIgnoreCase("mcchicken")) {
return McChicken.class.newInstance();
} else if(type.equalsIgnoreCase("chips")) {
return Chips.class.newInstance();
} else {
System.out.println("哎呀!找不到相应的实例化类啦!");
return null;
}
}
}
1.3简单工厂设计模式的优点和缺点
优点:工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
缺点:简单工厂模式违背了“开放封闭原则”,就是违背了“系统对扩展开放,对修改关闭”的原则。创建何种种类产品的产品相互混淆在了一起,违背了单一职责,导致系统丧失灵活性和可维护性。
2.适配器模式
讲一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作了。
也就是说 系统的数据和行为都正确,但接口不符合时,我们应该考虑适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但接口又与复用环境不一致的情况。
2.1适配器模式的类图
2.2适配器模式的代码实现
public class Target { public virtual void Request() { Console.WriteLine("This is a common request"); } } /// <summary> /// 定义需要适配的类 /// </summary> public class Adaptee { public void SpecificRequest() { Console.WriteLine("This is a special request."); } } /// <summary> /// 定义适配器 /// </summary> public class Adapter:Target { // 建立一个私有的Adeptee对象 private Adaptee adaptee = new Adaptee(); /// <summary> /// 通过重写,表面上调用Request()方法,变成了实际调用SpecificRequest() /// </summary> public override void Request() { adaptee.SpecificRequest(); } }
2.3适配器模式的优点和缺点
优点:
通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
复用了现存的类,解决了现存类和复用环境要求不一致的问题。
将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
缺点:
对于对象适配器来说,更换适配器的实现过程比较复杂。
3.接口模式
接口型模式组成 : 该模式包括适配器模式,外观模式,合成模式,桥接模式 四种模式;
目的:利用现有的类,满足需要的接口
3.1接口模式的代码实现
-
public class ShowRocketTable {
-
public static void main(String[] args) {
-
setFonts();
-
JTable table = new JTable(getRocketTable());
-
table.setRowHeight(36);
-
JScrollPane pane = new JScrollPane(table);
-
pane.setPreferredSize(new java.awt.Dimension(300, 100));
-
display(pane, " Rockets");
-
}
-
-
/**
-
* Display a Swing component. We'll refactor this later into a nice facade.
-
*
-
* @param c the component to display
-
* @param title the window title
-
*/
-
public static void display(Component c, String title) {
-
JFrame frame = new JFrame(title);
-
frame.getContentPane().add(c);
-
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
frame.pack();
-
frame.setVisible(true);
-
}
-
-
private static RocketTableModel getRocketTable() {
-
Rocket r1 = new Rocket("Shooter", 1.0, new Dollars(3.95), 50.0, 4.5);
-
Rocket r2 = new Rocket("Orbit", 2.0, new Dollars(29.03), 5000, 3.2);
-
return new RocketTableModel(new Rocket[] { r1, r2 });
-
}
-
-
private static void setFonts() {
-
Font font = new Font("Dialog", Font.PLAIN, 18);
-
UIManager.put("Table.font", font);
-
UIManager.put("TableHeader.font", font);
-
}
-
}