设计模式(一)
1. 工厂模式
工厂模式是最简单的设计模式之一,核心思想是将实体类的生成逻辑封装,并使用同一个接口来指向创建的对象。
1、创建一个共同接口
public interface Animal {
public void run();
}
2、创建实现该接口的实体类
public class Bird implements Animal{
public void run() {
// TODO Auto-generated method stub
System.out.println("Bird -> flying");
}
}
public class Dog implements Animal{
public void run() {
// TODO Auto-generated method stub
System.out.println("dog -> running");
}
}
public class Fish implements Animal{
public void run() {
// TODO Auto-generated method stub
System.out.println("fish -> swimming");
}
}
3、创建工厂类,该工厂类负责生成被该接口指向的实体类
public class Factory {
public Animal create(String str) {
if(str.equalsIgnoreCase("dog")){
return new Dog();
}
if(str.equalsIgnoreCase("bird")){
return new Bird();
}
if(str.equalsIgnoreCase("fish")){
return new Fish();
}
return null;
}
}
4、测试
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Factory factory = new Factory();
Animal dog = factory.create("dog");
dog.run();
Animal bird = factory.create("bird");
bird.run();
Animal fish = factory.create("fish");
fish.run();
}
}
5、结果(控制台输出)
dog -> running
Bird -> flying
fish -> swimming
总结:
工厂模式提供了一种隐藏生成逻辑的创建对象的方法。
2. 抽象工厂模式
抽象工厂模式是创建工厂的工厂,该设计模式同样隐藏了生成的逻辑。
1、创建接口
public interface Animal {
public void run();
}
public interface Plant {
public void quiet();
}
2、创建实现接口的实体类
public class Bird implements Animal{
public void run() {
// TODO Auto-generated method stub
System.out.println("Bird -> flying");
}
}
public class Dog implements Animal{
public void run() {
// TODO Auto-generated method stub
System.out.println("dog -> running");
}
}
public class Fish implements Animal{
public void run() {
// TODO Auto-generated method stub
System.out.println("fish -> swimming");
}
}
public class Flower implements Plant{
public void quiet() {
// TODO Auto-generated method stub
System.out.println("flower -> beautiful");
}
}
public class Tree implements Plant{
public void quiet() {
// TODO Auto-generated method stub
System.out.println("tree -> high");
}
}
3、创建抽象工厂类
public abstract class AbstractFactory {
abstract Animal getAnimal(String str);
abstract Plant getPlant(String str);
}
4、创建实体工厂
public class AnimalFactory extends AbstractFactory{
Animal getAnimal(String str) {
if(str.equalsIgnoreCase("bird")){
return new Bird();
}
if(str.equalsIgnoreCase("dog")){
return new Dog();
}
if(str.equalsIgnoreCase("fish")){
return new Fish();
}
return null;
}
Plant getPlant(String str) {
// TODO Auto-generated method stub
return null;
}
}
public class PlantFactory extends AbstractFactory{
Animal getAnimal(String str) {
// TODO Auto-generated method stub
return null;
}
Plant getPlant(String str) {
// TODO Auto-generated method stub
if(str.equalsIgnoreCase("tree")){
return new Tree();
}
if(str.equalsIgnoreCase("flower")){
return new Flower();
}
return null;
}
}
5、测试
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
AbstractFactory animalFactory=FactoryProducer.createFactory("animal");
Animal dog = animalFactory.getAnimal("dog");
dog.run();
Animal bird = animalFactory.getAnimal("bird");
bird.run();
Animal fish = animalFactory.getAnimal("fish");
fish.run();
AbstractFactory plantFactory=FactoryProducer.createFactory("plant");
Plant tree = plantFactory.getPlant("tree");
tree.quiet();
Plant flower = plantFactory.getPlant("flower");
flower.quiet();
}
}
6、结果
dog -> running
Bird -> flying
fish -> swimming
tree -> high
flower -> beautiful
总结:
抽象工厂类隐藏了创建逻辑,并且进行了实体类的分类。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。