【设计模式】【一】创建型模式总结

    前文提到,设计模式大致分为创建型、结构型、以及行为型三个大类。

    而创建型模式、多为更合理的创建对象而设计,由于J2EE中对象的创建多为Spring管理,所以实际开发中使用的并不多。当然不包括造轮子的大牛们。

    于此,简单总结了创建型模式的应用场景以及简单示例,欢迎指点:

一、单例模式

        简介:顾名思义,单例模式(singleton pattern)保证一个类只生产一个对象。

        情景:用于一些重量级资源,节约资源。

        注意:多线程下需要注意同步锁。

        Demo:

/**
 * singleton pattern
 * @author ZX
 *
 */
public class SingleObject {
    //
    private static SingleObject instance = new SingleObject();
    public static SingleObject getInstance(){
        return instance;
    }
    //私有构造方法,不允许直接创建对象
    private SingleObject() {}
}

  更多:https://www.runoob.com/design-pattern/singleton-pattern.html

 

二、工厂模式

        简介:生产对象的工厂,工厂模式(Factory Pattern),提供一个接口,传入参数生产对应类型的对象。

        情景:例如数据库切换等。提升了系统的灵活性。

        注意:不宜滥用,工厂模式会增加类的数量与系统复杂度。

        Demo:

 

class FoodFactory {
	public Food getFood(String food){
		switch (food) {
		case "fish":
			return new Fish();
		case "meat":
			return new Meat();
		default:
			return new WestNothWind();
		}
	   
		
	}
}
interface Food{
}
class Fish implements Food{

	public Fish() {
		System.err.println("fish");
	}
	
}

class Meat implements Food{

	public Meat() {
		System.err.println("Meat");
	}
	
}

class WestNothWind implements Food{

	public WestNothWind() {
		System.err.println("****");
	}
	
}

public class TestFactoryPattern{
	public static void main(String[] args) {
		FoodFactory foodFactory = new FoodFactory();
		foodFactory.getFood("meat");
	}
}

  

 

三、抽象工厂模式

        简介:抽象工厂模式(Abstract Factory pattern),简单来说,就是生产工厂的工厂。

        情景:在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的对象,工厂方法就满足不了需求了。

        Demo:

 

//人对象
interface Human{
}
class Boy implements Human{

	public Boy() {
		System.err.println("boy");
	}
	
}

class Girl implements Human{

	public Girl() {
		System.err.println("girl");
	}
	
}

class Bill implements Human{

	public Bill() {
		System.err.println("????");
	}
	
}

//具体工厂
interface Factory{
	
}
class HumanFactory implements Factory{
	Human human=null;
	public Human getHuman(String sex){
		try {
			if(sex==null||"".equals(sex)){
				human=new Bill();
			}else if("男".equals(sex)){
				human=new Boy();
			}else if("女".equals(sex)){
				human=new Bill();
			}else{
				human=new Bill();
			}
		} catch (Exception e) {
			human=new Bill();
		}
		return human;
	}
}
//抽象工厂
class abstractFactory {
	public HumanFactory getHumanFactory(){
		return new HumanFactory();
	}
	public HumanFactory getAnimalFactory(){
		return new HumanFactory();
	}
}
public class TestFactoryPattern{
	public static void main(String[] args) {
		abstractFactory af = new abstractFactory();
		HumanFactory humanFactory = af.getHumanFactory();
		humanFactory.getHuman("男");
	}
}

  

 

四、建造者模式

        简介:建造者模式(Builder Pattern),打包创建对象

        情景:假如某一个大的对象由很多小对象构成(一台电脑由鼠标、键盘、主机。。。组成,抽象出一个接口为标准).

        Demo:

 

import java.util.ArrayList;
import java.util.List;

/**
 * 建造模式测试类
 * @author zx
 */
public class Test {
    public static void main(String[] args) {
        //静态-已经定义好了属性,根据定义好的属性去建造这个对象
        Computer personalComputer =new MyPersonComputer();
        personalComputer.addMouse("雪蛇");
        personalComputer.addKeyBord("樱桃园");
        personalComputer.addBox("耿想");
        personalComputer.addScreen("朋基");
        //动态-动态添加购物车
        ShoppingCart b = new ShoppingCart();
        b.buy(new Pen());
        b.buy(new Ball());
        System.out.println("需支付:"+b.getPrice());
    }
}

/**
 * 第一种,静态建造模式
 */
abstract class Computer {
    protected String mouse;
    protected String keyBord;
    protected String box;
    protected String screen;

    abstract void addMouse(String mouse);

    abstract void addKeyBord(String keyBord);

    abstract void addBox(String box);

    abstract void addScreen(String screen);


}
class MyPersonComputer extends Computer {
    @Override
    void addMouse(String mouse) {
        this.mouse=mouse;
    }

    @Override
    void addKeyBord(String keyBord) {
        this.keyBord=keyBord;
    }

    @Override
    void addBox(String box) {
        this.box=box;
    }

    @Override
    void addScreen(String screen) {
        this.screen=screen;
    }

}

/**
 * 第二种,动态的建造模式
 */
interface Shop {
    String getName();

    Double getPrice();
}

class Toy implements Shop {

    @Override
    public String getName() {
        return "toy";
    }

    @Override
    public Double getPrice() {
        return 10.0;
    }
}

class Pen implements Shop {
    @Override
    public String getName() {
        return "pen";
    }

    @Override
    public Double getPrice() {
        return 20.0;
    }
}

class Pencil implements Shop {

    @Override
    public String getName() {
        return "Pencil";
    }

    @Override
    public Double getPrice() {
        return 2.0;
    }
}

class Biro implements Shop {

    @Override
    public String getName() {
        return "Biro";
    }

    @Override
    public Double getPrice() {
        return 30.0;
    }
}

class Ball implements Shop {

    @Override
    public String getName() {
        return "ball";
    }

    @Override
    public Double getPrice() {
        return 40.0;
    }
}

/**
 * 购物车对象
 */
class ShoppingCart {
    List<Shop> shopList = new ArrayList<>();

    /**
     * 动态建造购物车商品列表
     * @param shop
     */
    public void buy(Shop shop) {
        shopList.add(shop);

    }

    public double getPrice() {
        double price = 0.0;
        for (Shop p : shopList) {
            price += p.getPrice();
        }
        return price;
    }
}

  



 

五、原型模式

        简介:原型模式(Prototype Pattern})预先创建好对象存放进map中,使用时直接取出即可.

        情景:数据源

        注意:对象类实现cloneable接口

        Demo:

 

public class Box {
	 private static Map<String, Color> map = new HashMap<String, Color>();
	 static{
		 map.put("red", new Red());
		 map.put("Green", new Green());
		 map.put("blue", new Blue());
	 }
	 public static Color getColor(String name){
		 return map.get(name);
	 }
	
}

 
public class T {
	 public static void main(String[] args) {
		 
		 Color color = Box.getColor("red");
		 color.show();
		 Color color2 = Box.getColor("red");
		 color2.show();
		 Color color3 = Box.getColor("red");
		 color3.show();
		 Color color4 = Box.getColor("red");
		 color4.show();
	}
}

  

 

        以上是五种创建型设计模式,主要用作创建对象,由于现在大多数项目都采用Spring来管理,所以可以不用太过关心对象的创建,大体上了解即可。

        整体看下来后,采用设计模式无非是本着想让代码更灵活,可复用以节约资源等目的而总结出的,所以多多实践,多多思考自然也能总结出自己的设计模式,是吧?

 

posted @ 2017-07-03 18:59  黑猫先生  阅读(397)  评论(0编辑  收藏  举报