上一篇我们先学习了单例和模板方法两个设计模式,单例模式在JDK中java.lang.Runtime使用饿汉式还有Spring从单例池获取bean的方法getSingleton,Spring解决循环依赖问题的核心也是采用三级缓存机制(三个Map存储Bean),接下来我们继续学习其他常见设计模式。
简单工厂不符合开闭原则,也不属于设计模式之一,但是在一些简单场景下还是比较实用的。
动物接口Animal.java
package cn.itxs.pattern.factory;
public interface Animal {
void showAnimal();
}
羊Sheep.java
package cn.itxs.pattern.factory;
public class Sheep implements Animal{
@Override
public void showAnimal() {
System.out.println("我是一只可爱的小绵羊!");
}
}
鸭子Duck.java
package cn.itxs.pattern.factory;
public class Duck implements Animal{
@Override
public void showAnimal() {
System.out.println("我是一只调皮的小鸭子!");
}
}
动物生产工厂AnimalFactory.java,通过传入生产动物名返回对应动物对象
package cn.itxs.pattern.factory;
public class AnimalFactory {
public Animal createAnimal(String name){
Animal animal = null;
if ( "鸭子".equals(name) ){
animal = new Duck();
}else if ( "羊".equals(name) ){
animal = new Sheep();
}
return animal;
}
}
测试类
package cn.itxs.pattern.factory;
public class FactoryMain {
public static void main(String[] args) {
AnimalFactory animalFactory = new AnimalFactory();
Animal animal = animalFactory.createAnimal("羊");
animal.showAnimal();
}
}
通过将动物生产工厂抽象为农场接口,以后扩充则只需要新增相应的工厂和动物类,不需要修改原有,符合开闭原则。
农场接口Farm.java
package cn.itxs.pattern.factory;
public interface Farm {
Animal createAnimal();
}
生产鸭子农场DuckFarm.java
package cn.itxs.pattern.factory;
public class DuckFarm implements Farm{
@Override
public Animal createAnimal() {
return new Duck();
}
}
生产羊农场SheepFarm.java
package cn.itxs.pattern.factory;
public class SheepFarm implements Farm{
@Override
public Animal createAnimal() {
return new Sheep();
}
}
测试类
package cn.itxs.pattern.factory;
public class FactoryMain {
public static void main(String[] args) {
Farm farm = new DuckFarm();
Animal animal= farm.createAnimal();
animal.showAnimal();
}
}
抽象工厂也属于设计模式的一种,比如所有农场还要生产植物,且植物也有不同种类,比如农场即要生产羊还要生产番茄,抽象工厂就可以派上用场;而如果抽象工厂只有一个产品簇的维度则就退化为工厂方法。
植物接口Plant.java
package cn.itxs.pattern.factory;
public interface Plant {
void showPlant();
}
玉米类Plant.java
package cn.itxs.pattern.factory;
public class Corn implements Plant{
@Override
public void showPlant() {
System.out.println("我是一颗玉米!");
}
}
番茄类Plant.java
package cn.itxs.pattern.factory;
public class Tomato implements Plant{
@Override
public void showPlant() {
System.out.println("我是一颗番茄!");
}
}
农场接口Farm.java
package cn.itxs.pattern.factory;
public interface Farm {
Animal createAnimal();
Plant createPlant();
}
深圳农场SZFarm.java生产鸭子和玉米
package cn.itxs.pattern.factory;
public class SZFarm implements Farm {
@Override
public Animal createAnimal() {
return new Duck();
}
@Override
public Plant createPlant() {
return new Corn();
}
}
广州农场GZFarm.java生产羊和番茄
package cn.itxs.pattern.factory;
public class GZFarm implements Farm {
@Override
public Animal createAnimal() {
return new Sheep();
}
@Override
public Plant createPlant() {
return new Tomato();
}
}
测试类
package cn.itxs.pattern.factory;
public class FactoryMain {
public static void main(String[] args) {
Farm farm = new GZFarm();
Animal animal= farm.createAnimal();
animal.showAnimal();
Plant plant = farm.createPlant();
plant.showPlant();
}
}
类似如Lombok的@Builder,JDK中的StringBuilder;如果创建的产品种类只有一种,只需要一个具体建造者,这时可以省略掉抽象建造者,甚至还可以省略掉指挥者角色
用户类User.java
package cn.itxs.pattern.builder;
public class User {
private int id;
private String name;
private int age;
private String homeAddress;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getHomeAddress() {
return homeAddress;
}
public void setHomeAddress(String homeAddress) {
this.homeAddress = homeAddress;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", homeAddress='" + homeAddress + '\'' +
'}';
}
}
用户建造者类UserBuilder.java
package cn.itxs.pattern.builder;
public class UserBuilder {
private User user = new User();
public UserBuilder id(int id){
user.setId(id);
return this;
}
public UserBuilder name(String name){
user.setName(name);
return this;
}
public UserBuilder age(int age){
user.setAge(age);
return this;
}
public UserBuilder homeAddress(String homeAddress){
user.setHomeAddress(homeAddress);
return this;
}
public User build(){
return user;
}
}
测试类
package cn.itxs.pattern.builder;
public class BuilderMain {
public static void main(String[] args) {
User user = new UserBuilder().id(1).name("张三").age(25).homeAddress("海天一路").build();
System.out.println(user);
}
}
建造者模式和setter方法区别在于setter是先new出来对象,而建造者模式只会在最后build之后才能使用对象。
卧室类BedRoom.java
package cn.itxs.pattern.builder;
public class BedRoom {
private String bed;
private String light;
private String dresser;
public void setBed(String bed) {
this.bed = bed;
}
public void setLight(String light) {
this.light = light;
}
public void setDresser(String dresser) {
this.dresser = dresser;
}
public void display(){
System.out.println("BedRoom{" +
"bed='" + bed + '\'' +
", light='" + light + '\'' +
", dresser='" + dresser + '\'' +
'}');
}
}
抽象装修工类Decorator.java
package cn.itxs.pattern.builder;
public abstract class Decorator {
protected BedRoom bedRoom = new BedRoom();
abstract void buildBed();
abstract void buildLight();
abstract void buildDresser();
public BedRoom builder(){
return bedRoom;
}
}
豪华装修工人LuxuryDecorator.java
package cn.itxs.pattern.builder;
public class LuxuryDecorator extends Decorator{
@Override
void buildBed() {
bedRoom.setBed("豪华大床");
}
@Override
void buildLight() {
bedRoom.setLight("豪华吊灯");
}
@Override
void buildDresser() {
bedRoom.setDresser("豪华梳妆台");
}
}
简单轻装修工LightDecorator.java
package cn.itxs.pattern.builder;
public class LightDecorator extends Decorator{
@Override
void buildBed() {
bedRoom.setBed("普通床");
}
@Override
void buildLight() {
bedRoom.setLight("普通照明灯");
}
@Override
void buildDresser() {
bedRoom.setDresser("普通梳妆台");
}
}
装修指挥者DesignerManager.java
package cn.itxs.pattern.builder;
public class DesignerManager {
private Decorator decorator;
public DesignerManager(Decorator decorator) {
this.decorator = decorator;
}
public BedRoom decorate(){
decorator.buildBed();
decorator.buildLight();
decorator.buildDresser();
return decorator.builder();
}
}
测试类
package cn.itxs.pattern.builder;
public class BuilderMain {
public static void main(String[] args) {
Decorator decorator = new LuxuryDecorator();
DesignerManager designerManager = new DesignerManager(decorator);
BedRoom bedRoom = designerManager.decorate();
bedRoom.display();
}
}
旅行方式接口TravelStrategy.java
package cn.itxs.pattern.strategy;
public interface TravelStrategy {
void tripMode();
boolean isFeasible(int mileage);
}
公交车出行BusStrategy.java
package cn.itxs.pattern.strategy;
public class BusStrategy implements TravelStrategy{
@Override
public void tripMode() {
System.out.println("使用公交车出行");
}
@Override
public boolean isFeasible(int mileage) {
if (mileage < 30){
return true;
}
return false;
}
}
汽车出行CarStrategy.java
package cn.itxs.pattern.strategy;
public class CarStrategy implements TravelStrategy{
@Override
public void tripMode() {
System.out.println("使用汽车出行");
}
@Override
public boolean isFeasible(int mileage) {
if (mileage>= 30 && mileage < 500){
return true;
}
return false;
}
}
高铁出行TrainStrategy.java
package cn.itxs.pattern.strategy;
public class TrainStrategy implements TravelStrategy{
@Override
public void tripMode() {
System.out.println("使用高铁出行");
}
@Override
public boolean isFeasible(int mileage) {
if (mileage >= 500 && mileage < 1000){
return true;
}
return false;
}
}
飞机出行AirPlaneStrategy.java
package cn.itxs.pattern.strategy;
public class AirPlaneStrategy implements TravelStrategy{
@Override
public void tripMode() {
System.out.println("使用飞机出行");
}
@Override
public boolean isFeasible(int mileage) {
if (mileage > 1000){
return true;
}
return false;
}
}
出行决策环境类BusStrategy.java,由出行方式环境类来决策出行方式
package cn.itxs.pattern.strategy;
import java.util.ArrayList;
import java.util.List;
public class TravelContext {
private List travelStrategies;
public TravelContext() {
this.travelStrategies = new ArrayList<>();
travelStrategies.add(new BusStrategy());
travelStrategies.add(new CarStrategy());
travelStrategies.add(new TrainStrategy());
travelStrategies.add(new AirPlaneStrategy());
}
public void trip(int mileage){
for (TravelStrategy travelStrategy : travelStrategies) {
if (travelStrategy.isFeasible(mileage)){
travelStrategy.tripMode();
break;
}
}
}
}
测试类
package cn.itxs.pattern.strategy;
public class StrategyMain {
public static void main(String[] args) {
TravelContext travelContext = new TravelContext();
travelContext.trip(800);
}
}
公司绩效考核结果状态,绩效考核状态抽象类PerformanceState.java
package cn.itxs.pattern.state;
abstract class PerformanceState {
protected PerformanceContext pc;
protected String stateName;
protected int score;
public abstract void checkState();
public void addScore(int score){
this.score += score;
System.out.println("当前分数为:" + this.score);
checkState();
System.out.println("当前状态:"+pc.getPerformanceState().stateName);
}
}
绩效考核环境类PerformanceContext.java
package cn.itxs.pattern.state;
public class PerformanceContext {
private PerformanceState performanceState;
public PerformanceContext() {
performanceState = new DisqualificationState(this);
}
public PerformanceState getPerformanceState() {
return performanceState;
}
public void setPerformanceState(PerformanceState performanceState) {
this.performanceState = performanceState;
}
public void add(int score){
this.performanceState.addScore(score);
}
}
绩效不合格状态DisqualificationState.java
package cn.itxs.pattern.state;
public class DisqualificationState extends PerformanceState{
public DisqualificationState(PerformanceContext performanceContext) {
pc = performanceContext;
stateName = "不合格";
score = 0;
}
public DisqualificationState(PerformanceState performanceState) {
pc = performanceState.pc;
stateName = "不合格";
score = performanceState.score;
}
@Override
public void checkState() {
if (score >= 60 && score<70){
pc.setPerformanceState(new ImproveState(this));
}else if (score >= 70 && score<80){
pc.setPerformanceState(new QualificationState(this));
}else if (score >= 80 && score<90){
pc.setPerformanceState(new GoodState(this));
}else if (score >= 90){
pc.setPerformanceState(new ExcellentState(this));
}
}
}
绩效需改进状态ImproveState.java
package cn.itxs.pattern.state;
public class ImproveState extends PerformanceState{
public ImproveState(PerformanceState performanceState) {
pc = performanceState.pc;
stateName = "需改进";
score = performanceState.score;
}
@Override
public void checkState() {
if (score < 60){
pc.setPerformanceState(new DisqualificationState(this));
}else if (score >= 70 && score<80){
pc.setPerformanceState(new QualificationState(this));
}else if (score >= 80 && score<90){
pc.setPerformanceState(new GoodState(this));
}else if (score >= 90){
pc.setPerformanceState(new ExcellentState(this));
}
}
}
绩效合格状态QualificationState.java
package cn.itxs.pattern.state;
public class QualificationState extends PerformanceState{
public QualificationState(PerformanceState performanceState) {
pc = performanceState.pc;
stateName = "合格";
score = performanceState.score;
}
@Override
public void checkState() {
if (score < 60){
pc.setPerformanceState(new DisqualificationState(this));
}if (score >= 60 && score<70) {
pc.setPerformanceState(new ImproveState(this));
}else if (score >= 80 && score<90){
pc.setPerformanceState(new GoodState(this));
}else if (score >= 90){
pc.setPerformanceState(new ExcellentState(this));
}
}
}
绩效优良状态GoodState.java
package cn.itxs.pattern.state;
public class GoodState extends PerformanceState{
public GoodState(PerformanceState performanceState) {
pc = performanceState.pc;
stateName = "优良";
score = performanceState.score;
}
@Override
public void checkState() {
if (score < 60){
pc.setPerformanceState(new DisqualificationState(this));
}if (score >= 60 && score<70) {
pc.setPerformanceState(new ImproveState(this));
}else if (score >= 70 && score<80){
pc.setPerformanceState(new QualificationState(this));
}else if (score >= 90){
pc.setPerformanceState(new ExcellentState(this));
}
}
}
绩效优秀状态PerformanceState.java
package cn.itxs.pattern.state;
public class ExcellentState extends PerformanceState{
public ExcellentState(PerformanceState performanceState) {
pc = performanceState.pc;
stateName = "优秀";
score = performanceState.score;
}
@Override
public void checkState() {
if (score < 60){
pc.setPerformanceState(new DisqualificationState(this));
}if (score >= 60 && score<70) {
pc.setPerformanceState(new ImproveState(this));
}else if (score >= 70 && score<80){
pc.setPerformanceState(new QualificationState(this));
}else if (score >= 80 && score<90) {
pc.setPerformanceState(new GoodState(this));
}
}
}
测试类,绩效考核随着分数变化状态相应变化
package cn.itxs.pattern.state;
public class StateMain {
public static void main(String[] args) {
PerformanceContext performanceContext = new PerformanceContext();
performanceContext.add(50);
performanceContext.add(10);
performanceContext.add(11);
performanceContext.add(12);
performanceContext.add(13);
performanceContext.add(-20);
}
}
发动机接口Engine.java
package cn.itxs.pattern.adaptor;
public interface Engine {
void drive();
}
电能驱动发动机类ElectricEngine.java
package cn.itxs.pattern.adaptor;
public class ElectricEngine {
public void electricDrive(){
System.out.printf("使用电能驱动发动机");
}
}
太阳能驱动发动机类SolarEngine.java
package cn.itxs.pattern.adaptor;
public class SolarEngine {
public void solarDrive(){
System.out.printf("使用太阳能驱动发动机");
}
}
电能适配器类ElectricEngine.java
package cn.itxs.pattern.adaptor;
public class ElectricAdaptor implements Engine{
private ElectricEngine electricEngine;
public ElectricAdaptor() {
electricEngine = new ElectricEngine();
}
@Override
public void drive() {
electricEngine.electricDrive();
}
}
太阳能适配器类ElectricEngine.java
package cn.itxs.pattern.adaptor;
public class SolarAdaptor implements Engine{
private SolarEngine solarEngine;
public SolarAdaptor() {
solarEngine = new SolarEngine();
}
@Override
public void drive() {
solarEngine.solarDrive();
}
}
测试类,实现电能适配
package cn.itxs.pattern.adaptor;
public class AdaptorMain {
public static void main(String[] args) {
Engine engine = new ElectricAdaptor();
engine.drive();
}
}
用户子系统加积分User.java
package cn.itxs.pattern.facade;
public class User {
public void credits(){
System.out.println("加积分");
}
}
商品子系统减库存Good.java
package cn.itxs.pattern.facade;
public class Good {
public void deduct(){
System.out.println("减库存");
}
}
物流配送子系统下物流单Delivery.java
package cn.itxs.pattern.facade;
public class Delivery {
public void send(){
System.out.println("下物流单");
}
}
订单门面提供下单请求统一处理OrderFacade.java
package cn.itxs.pattern.facade;
public class OrderFacade {
private Good good = new Good();
private User user = new User();
private Delivery delivery = new Delivery();
public void orderRequest(){
good.deduct();
user.credits();
delivery.send();
}
}
测试类
package cn.itxs.pattern.facade;
public class FacadeMain {
public static void main(String[] args) {
OrderFacade orderFacade = new OrderFacade();
orderFacade.orderRequest();
}
}
商品操作数据库类GoodsMapper.java
package cn.itxs.pattern.proxy;
public class GoodsMapper {
public void handleJDBC(){
System.out.println("商品数据写入数据库");
}
}
商品代理类GoodsStaticProxy.java
package cn.itxs.pattern.proxy;
public class GoodsStaticProxy {
private GoodsMapper goodsMapper;
public GoodsStaticProxy(GoodsMapper goodsMapper) {
this.goodsMapper = goodsMapper;
}
public void handleJDBC(){
System.out.println("获取数据库连接");
goodsMapper.handleJDBC();
System.out.println("关闭数据库连接");
}
}
测试类,这样获取数据库和关闭数据库就由代理类来完成,
package cn.itxs.pattern.proxy;
public class StaticProxyMain {
public static void main(String[] args) {
GoodsStaticProxy goodsStaticProxy = new GoodsStaticProxy(new GoodsMapper());
goodsStaticProxy.handleJDBC();
}
}
如果有多个业务数据库操作类比如增加物流配送Mapper,先定义接口CommonMapper.java
package cn.itxs.pattern.proxy;
public interface CommonMapper {
void handleJDBC();
}
商品操作数据库类GoodsMapper.java实现CommonMapper接口
package cn.itxs.pattern.proxy;
public class GoodsMapper implements CommonMapper{
@Override
public void handleJDBC(){
System.out.println("商品数据写入数据库");
}
}
物流配送操作数据库类GoodsMapper.java实现CommonMapper接口
package cn.itxs.pattern.proxy;
public class DeliveryMapper implements CommonMapper{
@Override
public void handleJDBC(){
System.out.println("物流单数据写入数据库");
}
}
通用代理类CommonStaticProxy.java
package cn.itxs.pattern.proxy;
public class CommonStaticProxy {
private CommonMapper commonMapper;
public CommonStaticProxy(CommonMapper commonMapper) {
this.commonMapper = commonMapper;
}
public void handleJDBC(){
System.out.println("获取数据库连接");
commonMapper.handleJDBC();
System.out.println("关闭数据库连接");
}
}
测试类
package cn.itxs.pattern.proxy;
public class StaticProxyMain {
public static void main(String[] args) {
CommonStaticProxy commonStaticProxy = new CommonStaticProxy(new GoodsMapper());
commonStaticProxy.handleJDBC();
commonStaticProxy = new CommonStaticProxy(new DeliveryMapper());
commonStaticProxy.handleJDBC();
}
}
很明显如果还有其他接口需要统一代理则上面的静态代理则需要新增加代理类来实现,无法统一代理统一方法实现。增加行为接口BehaviorMapper.java
package cn.itxs.pattern.proxy;
public interface BehaviorMapper {
void doLog();
}
登录日志类LoginMapper.java
package cn.itxs.pattern.proxy;
public class LoginMapper implements BehaviorMapper{
@Override
public void doLog() {
System.out.println("登录日志业务数据库入库");
}
}
ItxsInvocationHandle.java
package cn.itxs.pattern.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ItxsInvocationHandle implements InvocationHandler {
private Object target;
public ItxsInvocationHandle(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("获取数据库连接");
method.invoke(target,args);
System.out.println("关闭数据库连接");
return null;
}
}
测试类,可以实现CommonMapper接口和BehaviorMapper接口代理。
package cn.itxs.pattern.proxy;
import java.lang.reflect.Proxy;
public class DynamicProxyMain {
public static void main(String[] args) {
GoodsMapper goodsMapper = new GoodsMapper();
ItxsInvocationHandle invocationHandle = new ItxsInvocationHandle(goodsMapper);
CommonMapper goodsMapperI = (CommonMapper)Proxy.newProxyInstance(goodsMapper.getClass().getClassLoader(),goodsMapper.getClass().getInterfaces(),invocationHandle);
goodsMapperI.handleJDBC();
LoginMapper loginMapper = new LoginMapper();
invocationHandle = new ItxsInvocationHandle(loginMapper);
BehaviorMapper loginMapperI = (BehaviorMapper)Proxy.newProxyInstance(loginMapper.getClass().getClassLoader(),loginMapper.getClass().getInterfaces(),invocationHandle);
loginMapperI.doLog();
}
}
JDK动态代码源码如下,可以看出代理类名称Proxy后面加自增序列号,将生成类的字节码直接放在jvm的内存中,如果有兴趣也可以直接将将Proxy0的byte[] proxyClassFile的字节码写到本地文件看下类的信息。
商品接口Item.java
package cn.itxs.pattern.composite;
public interface Item {
float calculate();
void dispaly();
}
物品类实现商品接口Articles.java
package cn.itxs.pattern.composite;
public class Articles implements Item{
private String name;
private int quantify;
private float price;
public Articles(String name, int quantify, float price) {
this.name = name;
this.quantify = quantify;
this.price = price;
}
@Override
public float calculate() {
return quantify*price;
}
@Override
public void dispaly() {
System.out.println("商品{" +
"名称='" + name + '\'' +
", 数量=" + quantify +
", 单价=" + price +
'}');
}
}
袋子类实现商品接口Bag.java
package cn.itxs.pattern.composite;
import java.util.ArrayList;
import java.util.List;
public class Bag implements Item{
private String name;
private List- bags = new ArrayList
- ();
public Bag(String name) {
this.name = name;
}
public void add(Item item){
bags.add(item);
}
public void remove(Item item){
bags.remove(item);
}
public Item getChildNode(int index){
return bags.get(index);
}
@Override
public float calculate() {
float total = 0;
for (Item bag : bags) {
total += bag.calculate();
}
return total;
}
@Override
public void dispaly() {
for (Item bag : bags) {
bag.dispaly();
}
}
}
测试类,袋子可以存放商品或袋子,最终显示商品列表详情和总价
package cn.itxs.pattern.composite;
public class CompositeMain {
public static void main(String[] args) {
Bag bigBag = new Bag("大号袋子");
Bag mediumBag = new Bag("中号袋子");
Bag smallLucencyBag = new Bag("小号透明袋子");
Bag smallGrayBag = new Bag("小号灰色袋子");
Articles articles;
articles = new Articles("金鲳鱼",1,25.6f);
smallLucencyBag.add(articles);
articles = new Articles("火龙果",5,4.9f);
smallGrayBag.add(articles);
articles = new Articles("柠檬",3,1.2f);
smallGrayBag.add(articles);
articles = new Articles("雪花啤酒",4,4.6f);
mediumBag.add(articles);
articles = new Articles("椰奶",2,4.5f);
mediumBag.add(articles);
mediumBag.add(smallLucencyBag);
articles = new Articles("耐克运动鞋",1,299.9f);
bigBag.add(articles);
bigBag.add(smallGrayBag);
bigBag.add(mediumBag);
bigBag.dispaly();
float total = bigBag.calculate();
System.out.println("总计:" + total +"元");
}
}
人物接口Figure.java
package cn.itxs.pattern.decorate;
public interface Figure {
void show();
}
绿箭侠原身类实现人物接口Arrow.java
package cn.itxs.pattern.decorate;
public class Arrow implements Figure{
@Override
public void show() {
System.out.println("绿箭侠原身");
}
}
变身父类或者装饰类实现人物接口Transfiguration.java
package cn.itxs.pattern.decorate;
public class Transfiguration implements Figure{
Figure figure;
public Transfiguration(Figure figure) {
this.figure = figure;
}
@Override
public void show() {
figure.show();
}
}
天使变身具体类Angel.java
package cn.itxs.pattern.decorate;
public class Angel extends Transfiguration{
public Angel(Figure figure) {
super(figure);
}
@Override
public void show() {
System.out.println("天使化身形象附在");
super.show();
}
}
恶魔变身具体类Figure.java
package cn.itxs.pattern.decorate;
public class Demon extends Transfiguration{
public Demon(Figure figure) {
super(figure);
}
@Override
public void show() {
System.out.println("恶魔化身形象附在");
super.show();
}
}
测试类
package cn.itxs.pattern.decorate;
public class DecorateMain {
public static void main(String[] args) {
Figure arrow = new Arrow();
arrow.show();
Figure arrowAngel = new Angel(arrow);
arrowAngel.show();
Figure arrowDemon = new Demon(arrow);
arrowDemon.show();
}
}
证书类Certificate.java实现Cloneable接口
package cn.itxs.pattern.prototype;
public class Certificate implements Cloneable{
private String name;
private String company;
private String detail;
public Certificate(String name, String company, String detail) {
this.name = name;
this.company = company;
this.detail = detail;
System.out.println("证书创建成功");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public void show() {
System.out.println("Certificate{" +
"name='" + name + '\'' +
", company='" + company + '\'' +
", detail='" + detail + '\'' +
'}');
}
@Override
public Object clone() throws CloneNotSupportedException {
System.out.println("证书拷贝成功");
return (Certificate)super.clone();
}
}
测试类
package cn.itxs.pattern.prototype;
public class ProtoTypeMain {
public static void main(String[] args) throws CloneNotSupportedException {
Certificate certificate = new Certificate("林有力","大疆无边科技股份有限公司","2021年获得信息系统架构师");
certificate.show();
Certificate clone = (Certificate)certificate.clone();
clone.setName("李天生");
clone.show();
}
}
如果上面证书Certificate类中有非基本类型的话,那么浅克隆无法对引用类型实现克隆。
等级类Level.java
package cn.itxs.pattern.prototype;
public class Level implements Cloneable{
private String name;
private String detail;
public Level(String name, String detail) {
this.name = name;
this.detail = detail;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
证书类Certificate.java,还是使用上面克隆实现方式
package cn.itxs.pattern.prototype;
public class Certificate implements Cloneable{
private String name;
private String company;
private String detail;
private Level level;
public Certificate(String name, String company, String detail, Level level) {
this.name = name;
this.company = company;
this.detail = detail;
this.level = level;
System.out.println("证书创建成功");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public Level getLevel() {
return level;
}
public void setLevel(Level level) {
this.level = level;
}
public void show() {
System.out.println("Certificate{" +
"name='" + name + '\'' +
", company='" + company + '\'' +
", detail='" + detail + '\'' +
", level name='" + level.getName() + '\'' +
", level detail='" + level.getDetail() + '\'' +
'}');
}
@Override
public Object clone() throws CloneNotSupportedException {
System.out.println("证书拷贝成功");
return (Certificate)super.clone();
}
}
测试类
package cn.itxs.pattern.prototype;
public class ProtoTypeMain {
public static void main(String[] args) throws CloneNotSupportedException {
Level level = new Level("高级", "中国软件最有影响力");
Certificate certificate = new Certificate("林有力","大疆无边科技股份有限公司","2021年获得信息系统架构师",level);
certificate.show();
Certificate clone = (Certificate)certificate.clone();
clone.setName("李天生");
clone.show();
level.setName("中级");
clone.show();
}
}
再将Certificate.java中的clone()方法修改如下
@Override
public Object clone() throws CloneNotSupportedException {
System.out.println("证书拷贝成功");
Certificate certificate = (Certificate)super.clone();
certificate.level = (Level) level.clone();
return certificate;
}
重新运行测试类,结果如下
针对常用设计模式学习分享就暂时告一段落,后续有时间再补充其他的设计模式.........
留言与评论(共有 0 条评论) “” |